„Cześć, Amigo! Porozmawiajmy dalej o błędach. Tym razem przyjrzymy się błędom, z którymi kompilator nie zawsze ci pomoże. Uważaj, a dowiesz się czegoś o sobie”.
„Jestem gotów słuchać, Diego. Mam nadzieję, że nie będzie to dla mnie zbyt krępujące”.
Porównywanie obiektów z==
„Nasza lista najczęstszych błędów początkujących programistów zaczyna się od porównania obiektów (zwłaszcza ciągów znaków) za pomocą ==
operatora”
Przykład:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
System.out.println("The strings are equal");
}
„Robiłem to dość często. Teraz wyraźnie widzę, że ten kod nigdy nie wyświetli komunikatu „Struny są równe”, ponieważ instrukcja if
porównuje odwołania do dwóch różnych obiektów łańcuchowych”.
„Tak. Dlatego poprawną opcją byłoby:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
System.out.println("The strings are equal");
}
Zmiana String
obiektu
„Początkujący programiści często zapominają, że wszystkie obiekty klasy są niezmienne i że każda metoda klasy String
zwraca nowy obiekt – bieżący obiekt nigdy się nie zmienia”.
„Nie tak dawno temu dowiedziałem się, co oznacza niezmienność , ale myślę, że to zrobiłem.
„Jestem tego całkiem pewien. Przykład:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
„Ten kod jest bardzo podobny do poprawnego kodu, ale nie będzie działał zgodnie z oczekiwaniami. Metoda toUpperCase()
nie zmienia obiektu, na którym jest wywoływana. Prawidłowy kod wyglądałby tak:
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
„Dokładnie. Zrobiłem to, ale nawet tak naprawdę nie rozumiałem, co jest nie tak. Dziękuję za wyjaśnienie!”
Zapominanie o zainicjowaniu obiektów, które są elementami tablicy
„Innym częstym błędem jest zapominanie o zainicjowaniu zmiennej tablicowej. Przykład:
int[] array;
array[0] = 1;
array[0] = 2;
„Ten kod nie zadziała: musisz jawnie ustawić zmienną tablicową równą odwołaniu do obiektu kontenera, który będzie przechowywać elementy tablicy. Poprawna wersja:
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
Używanie zmiennej lokalnej zamiast zmiennej instancji.
„Początkujący nie lubią wymyślać długich i znaczących nazw zmiennych”.
„To prawda. Aby szybko załatwić sprawę, czasami nadaję zmiennym nazwy takie jak a
, b
, i i
”.
„Nie rób tego. To okrutne, gdy kod ma kilka takich zmiennych:
Umieść liczbę 99 w 100 komórkach tablicy |
---|
|
„O wiele trudniej jest popełnić błąd w kodzie z nazwami własnymi. Poprawna wersja wygląda tak:
Umieść liczbę 99 w 100 komórkach tablicy |
---|
|
Usuwanie elementu kolekcji
– Czy przejrzałeś już kolekcje?
„Dosłownie jednym okiem”.
„Jeśli nie wiesz, o czym mówię, to zanotuj sobie, żeby spojrzeć na przyszłość. Bardzo często zdarzają się sytuacje, kiedy jakiś element trzeba usunąć z kolekcji. Kod wygląda z grubsza tak Ten:
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);
for (Integer value: list)
if (value < 0)
list.remove(value);
„Ten kod nie zadziała, ponieważ nie można użyć pętli for-each
do jednoczesnego przeglądania elementów kolekcji i modyfikowania tej kolekcji.
„Istnieje kilka rozwiązań. Po pierwsze, możesz przejść przez jedną kolekcję i zmienić inną:
Rozwiązanie 1 |
---|
|
„Po drugie, od Javy 8 kolekcje mają removeIf()
metodę, do której można przekazać regułę (funkcja lambda) wskazującą, które elementy należy usunąć. Przykład:
Rozwiązanie 2 |
---|
|
Umieszczenie kilku klas z public
modyfikatorem w jednym pliku
„W pliku może być tylko jedna klasa publiczna. W pliku można zadeklarować więcej klas, ale muszą to być wewnętrzne klasy klasy publicznej lub nie mieć modyfikatora. Przykład public
:
Zawartość pliku Solution.java | Notatka |
---|---|
|
To jest niedozwolone: dwie klasy publiczne w jednym pliku. |
|
Ale możesz to zrobić. Klasa główna nie jest publiczna |
|
I możesz to zrobić. Klasa główna jest klasą zagnieżdżoną |
Wywoływanie zwykłych (niestatycznych) metod klasy z main()
metody statycznej
„Czasami początkujący programiści próbują uzyskać dostęp do niestatycznych zmiennych i metod z metody main()
lub innych metod statycznych. Taki kod oczywiście nie zadziała.
public class Solution
{
public int n = 100;
public int[] createArray()
{
return new int[n];
}
public static void main(String[]args)
{
int[] array = createArray();
}
}
„ main
Metoda może odnosić się tylko do metod/zmiennych statycznych. Cóż, albo musi najpierw utworzyć instancję klasy Solution
, a dopiero potem wywołać metody niestatyczne tego obiektu. Przykład:
Rozwiązanie 1 | Rozwiązanie 2 |
---|---|
|
|
Deklarowanie konstruktora jako metody
„Kolejnym częstym błędem jest niepoprawne zadeklarowanie konstruktora klasy. Nazwa konstruktora musi być taka sama jak nazwa klasy, a konstruktor nie ma typu wyniku. Najczęstsze błędy wyglądają tak:
|
Nie powinno tu być typu zwracanego |
|
Nazwa konstruktora jest nieprawidłowa. Musi pasować do nazwy klasy |
|
this brakuje. Zmienna value zostanie przypisana do siebie |
|
To wszystko jest poprawne. |
Niepoprawne dziedziczenie interfejsów
„Twórcy Javy starali się, aby była ona bardzo zbliżona do języka angielskiego, więc wybrali inne słowa kluczowe dla pewnych powiązanych pojęć.
Kiedy klasa dziedziczy klasę, musisz użyć słowa extends
kluczowego:
class Pet
{
}
class Cat extends Pet
{
}
„Kiedy klasa dziedziczy interfejs, a dokładniej go implementuje, musisz użyć słowa implements
kluczowego:
interface Meow
{
}
class Cat implements Meow
{
}
„Kiedy interfejs dziedziczy interfejs, użyj słowa extends
kluczowego:
interface Meow
{
}
interface Voice extends Meov
{
}
Pominięcie break
w switch
oświadczeniu
„Ostatnim błędem na dziś, ale nie ostatnim dla początkujących, jest nieumieszczenie stwierdzenia break
w switch
oświadczeniu. Przykład:
Zło | Prawidłowy |
---|---|
|
|
„Wiesz, Diego… Sądząc po zestawie błędów, które tu przedstawiłeś, wydaje mi się, jakbyś czytał mój osobisty dziennik… Albo obserwował, jak rozwiązuję zadania”.
„Ha! Nie mam co do tego wątpliwości. Czytałem, śledziłem i nadal to robię. Więc bądź czujny!”
"???"
„Nie martw się. Żartuję. Bądź czujny i popełniaj mniej głupich błędów”.
GO TO FULL VERSION