Warunek z equals();

0

Hej, kolejny problem, którego nie rozumiem, występuje w tej pętli:

for(i=0;i<50;i++){
				System.out.println(i);
				if(zawodnicy[i].equals(tresc)){
					System.out.println("Dane zostana dodane do istniejacego zawodnika");
					break;
				}
				else{ 
                                        if(zawodnicy[i] == null){
					System.out.println("Dodano nowego zawodnika - "+i);
					zawodnicy[i] = tresc;
					break;
				        }	
				}
				
			}

Kiedy warunek w (zawodnicy[i].equals(tresc)) to TRUE, program wyświetla zadane zdanie, jednak przy FALSE, powinna wejść w else, a wyrzuca taki błąd:
Exception in thread "main" java.lang.NullPointerException
at Zlecenie.main(Zlecenie.java:61)
gdzie 61 to wiersz z warunkiem if(zawodnicy[i].equals(tresc))
Mógłby mi ktoś wyjaśnić, skąd ten wyjątek? Może źle rozumiem działanie equals.

2

Wydaje mi się, że wyjątek jest stąd, że zawodnicy[i] == null, stąd nie możesz wywołać metody equals na obiekcie, który jest niezainicjalizowany. Ewentualnie możliwe jest, że niezaincjowana jest cała tablica zawodnicy, wtedy nie możesz odwołać się do elementu tablicy, która nie istnieje.
Prawdopodobnie powinieneś sprawdzać, czy zawodnicy != null albo czy zawodnicy[i] != null (zależy od reszty programu).

2

Dawno nie programował w Javie i mało programowałem (w Javi ;p) ale wydaje mi się że do obiektu którego wartość wynosi null nie można wywołać metody equals() bo nie ma do czego tego porównać , spróbuj najpierw wywołać == null

1

dla zawodnicy[i] == null masz null.equals(tresc). null nie ma żadnych metod ani właściwości. odwołanie do jakiejkolwiek metody/pola obiektu niezainicjowanego, czyli o wartości null będzie skutkować takim wyjątkiem.

na przyszłość polecam użyć google.

0

Dziękuję, by ominąć ten błąd wystarczyło, że najpierw sprawdza (zawodnicy[i] == null), a dopiero w przypadku wyniku false , sprawdza (zawodnicy[i].equals(tresc)).
Dzięki wszystkim

0

W Javie jeśli sprawdzamy czy obiekt jest null to można pisać
null == obiekt
Dzięki temu nie trzeba łapać wyjątku, jest to taki zwyczaj z C, służy jedynie temu, żeby nie wykonywać try{}catch(){}, przez zawodowych programistów jest to (przeważnie?) krytykowane. Osobiście lubię tak pisać by nie tworzyć kolejnego wcięcia w kodzie ( i to jest mój jedyny argument na obronę).

Działanie equals w Javie...
W językach OO rozróżniamy dwa rodzaje porównań:

  1. Shallow equality
  2. Deep equality

Shallow polega na sprawdzeniu czy dwa obiekty reprezentują to samo miejsce w pamięci. Czyli czy obiekty, są tymi samymi wskaźnikami na komórki pamięci.
Deep polega na sprawdzeniu czy zawartość obiektów jest taka sama.

Czyli jeśli obiekt1 wskazuje na to samo miejsce co obiekt2, a obiekt3 jest inną instancją (ale zawiera te same dane!) to:

Shallow equality przy porównaniach:

obiekt1 == obiekt2 //zwróci true
obiekt1 == obiekt3 //zwróci false

Natomiast deep equality przy porównaniach:

obiekt1.equals(obiekt2); //zwroci true
obiekt1.equals(obiekt3); //także zwróci true, bo obiekty mają te same informacje

W Javie instancje klas porównuje się używając właśnie equals. W Javie String jest klasą, nie obiektem prymitywnym, więc do porównania String powinno używać się metody equals();

Ty w swoim przykładzie napisałeś:

if(zawodnicy[i] == null)

Jeśli przypuszczę, że zawodnicy to jakaś lista Stringów to ten kod jest niepoprawny w Javie z dwóch powodów

  1. j/w deep euality
  2. sprawdzenie nulla musi wyrzucić wyjątek.
3
agilob napisał(a):

jest to taki zwyczaj z C, służy jedynie temu, żeby nie wykonywać try{}catch(){}, przez zawodowych programistów jest to (przeważnie?) krytykowane. Osobiście lubię tak pisać by nie tworzyć kolejnego wcięcia w kodzie ( i to jest mój jedyny argument na obronę).

gdzie przeczytałeś, że zawodowi programiści krytykują "ręczne" sprawdzanie nulli?
nie jest to żaden zwyczaj, tylko dobra praktyka programistyczna. try/catch powoduje dodatkowy narzut operacji, przez co spowalnia kod, ponadto łapanie wyjątków nie zawsze ma sens, m. in. w konstruktorach (oczywiście czasem, nie zawsze).

0

W kilku wątkach na SO to czytałem, że to zły zwyczaj, ale sprawny i często używany.

0

Wyjątki, jak sama nazwa wskazuje, powinny być rzucane w sytuacjach wyjątkowych, a nie setki razy na sekundę.

1

@agilob, wydaje mi się, że krytykowane jest pisanie if (null == obiekt) zamiast if (obiekt == null), a nie samo porównywania do nulla ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1