grizzly Napisano Wrzesień 9, 2013 Zgłoś Udostępnij Napisano Wrzesień 9, 2013 Witam Mam mały problem z zamknięciem pętli. Otóż napisałem sobie programik - mini kalkulator i nie udaje mi się zrobić tak, żeby użytkownik sam zadecydował czy chce zakończyć działanie programu, czy nie. package scanner; import java.util.Scanner; public class Application { public static void main(String[] args) { boolean stop; do { stop = false; // Tutaj mam cały kod, który działa poprawnie no i teraz chcę zamknąć pętlę. } Scanner scanner = new Scanner(System.in); System.out.println("Chcesz kontynuować? (T/N):"); String text = scanner.nextLine(); if (text == "T") stop = true; } while (stop == true); } } Bez względu na to czy wpiszę T czy N, program kończy działanie. Jak to naprawić? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Bartosz Wójcik Napisano Wrzesień 9, 2013 Zgłoś Udostępnij Napisano Wrzesień 9, 2013 Spróbuj postawić pułapkę na linijce if (text == "T"), uruchom program w trybie debugowania i zobacz co znajduje się w zmiennej text w chwili, gdy odczytany zostanie znak z klawiatury. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
grizzly Napisano Wrzesień 9, 2013 Autor Zgłoś Udostępnij Napisano Wrzesień 9, 2013 Właśnie w tym miejscu był problem, zamiast == "T" wstawiłem .equals("T") i działa. A tak na przyszłość skąd mam wiedzieć kiedy stosować ==, a kiedy .equals, żeby w przyszłości uniknąć podobnych problemów? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Bartosz Wójcik Napisano Wrzesień 9, 2013 Zgłoś Udostępnij Napisano Wrzesień 9, 2013 equals służy do porównywania stringów, == służy do porównywania obiektów (a nie ich wartości), może to być mylące, bo w niektórych językach programowania == także służy do porównywania stringów, jednak w C# musisz używać equals Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
grizzly Napisano Wrzesień 9, 2013 Autor Zgłoś Udostępnij Napisano Wrzesień 9, 2013 Zapamiętam, dzięki wielkie. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Environ Napisano Wrzesień 17, 2013 Zgłoś Udostępnij Napisano Wrzesień 17, 2013 Java ma typy proste(int, float itp) oraz typy obiektowe(Integer, Float itd) Dla typów prostych porównujesz wartości zmiennych czyli używasz ==, != Natomiast dla typów obiektowych porównywanie działa na zasadzie referencji i da się ją sprawdzić przez equials(). int i = 5; int j = 5; System.out.println(i == j); // true Integer ii = new Integer(6); Integer jj = new Integer(6); System.out.println(ii == jj); // false System.out.println(ii.equals(jj)); // true String str1 = "Ala ma kota"; String str2 = "Ala ma kota"; System.out.println(str1 == str2); // true System.out.println(str1.equals(str2)); //true String str3 = new String("Ala ma kota"); String str4 = new String("Ala ma kota"); System.out.println(str3 == str4); //false System.out.println(str3.equals(str4)); //true Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
reijoslav Napisano Wrzesień 18, 2013 Zgłoś Udostępnij Napisano Wrzesień 18, 2013 Tak jak napisał bartek i environ, == porównuje same adresy, z kolei equals() porównuje treść. Należałoby jednak dodać, że wszyskie stałe o typie String użyte w programie (więc, w twoim przypadku -- stringi takie jak "T" lub "Chcesz kontynuować? (T/N):") są dodawane do wewnętrznej puli stringów maszyny wirtualnej jeszcze przed rozpoczęciem działania programu. Użycie metody intern() na typie String wymusza odszukanie wybranego ciągu znaków w tej puli i zwrócenie referencji do tego konkretnego wpisu w puli stringów, jeśli ten string w puli istnieje. Jeśli nie istnieje, jest do niej dodawany i zwrócona zostanie referencja do (już istniejącego) nowego wpisu w puli stringów. Jak zostało wspomniane wcześniej, stosując porównanie a == b, zakładając że a i b są zmiennymi o typie String, porównywane są ze sobą dwie referencje. Gdy przynajmniej jedna z nich jest dynamicznie alokowana, nie jest możliwe określenie równości treści danych znajdujących się w tych zmiennych (za pomocą operatora ==). Jednak wymuszając dodanie treści tych zmiennych do puli stringów za pomocą .intern() -- if(a.intern() == b.intern()), porównywane są ze sobą referencje obiektów puli stringów. Biorąc pod uwagę charakter działania metody intern() i to, że wymusza ona istnienie tylko jednego obiektu w puli o danej treści, w sytuacji, gdy a i b zawierają te same dane, metody intern() będą wskazywać na ten sam obiekt w puli stringów, spełniając zadanie porównania treści zmiennych :) Dlatego też kod: if(text.intern() == "T".intern()) { stop = true; } też powinien spełniać swoje zadanie (mimo, że oczywiście lepiej używać equals()). Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
jari Napisano Wrzesień 28, 2013 Zgłoś Udostępnij Napisano Wrzesień 28, 2013 Według mnie w nawiasie wystarczy samo stop boolean stop; do{ //.... }while(stop) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.