CodeGym /Kursy /JAVA 25 SELF /Błędy przy deklarowaniu klas i obiektów

Błędy przy deklarowaniu klas i obiektów

JAVA 25 SELF
Poziom 23, Lekcja 0
Dostępny

1. Błędy przy deklarowaniu klasy

Brak modyfikatorów dostępu (package-private domyślnie)

W Javie, jeśli nie podasz jawnie modyfikatora dostępu dla klasy, będzie ona dostępna wyłącznie w bieżącym pakiecie. Nazywa się to package-private albo „dostęp domyślny”. Na przykład:

// Plik Book.java
class Book {
    String title;
}

Takiej klasy nie da się użyć z innego pakietu. Jeśli chcesz, aby klasa była dostępna wszędzie (a najczęściej tak właśnie powinno być dla głównych modeli), użyj modyfikatora public:

public class Book {
    String title;
}

Dlaczego to ważne?
Jeśli zapomnisz dodać public, możesz długo się zastanawiać, czemu jakiś Library z innego pakietu „nie widzi” twojej klasy.

Niezgodność nazwy klasy z nazwą pliku

W Javie nazwa pliku z klasą musi odpowiadać nazwie klasy public w tym pliku (z uwzględnieniem wielkości liter!). Na przykład:

// Plik Book.java
public class Book {
    // ...
}

Jeśli nazwiesz plik book.java (małą literą) albo, co gorsza, BooK.java, kompilator zgłosi błąd. To jeden z powodów, dla których IDE tak chętnie „krzyczy”, gdy zmienisz nazwę klasy, ale zapomnisz zmienić nazwę pliku.

Błędy w deklaracji: brak nawiasów klamrowych, nieprawidłowe położenie metod i pól

Java to język rygorystyczny. Jeśli zapomnisz gdzieś nawiasu klamrowego albo przypadkowo zadeklarujesz metodę wewnątrz innej metody (tak nie wolno!), kompilator natychmiast cię skoryguje.

Przykład nieprawidłowej deklaracji:

public class User
    String name; // Ups! Brak nawiasów klamrowych klasy

    public void printName() {
        System.out.println(name);
    }
}

Poprawna wersja:

public class User {
    String name;

    public void printName() {
        System.out.println(name);
    }
}

Zapamiętaj:

  • Wszystkie pola i metody deklaruje się tylko wewnątrz nawiasów klamrowych klasy.
  • Metody nie mogą być zagnieżdżane jedna w drugiej (w niektórych językach to dozwolone, ale nie w Javie!).

2. Błędy przy tworzeniu obiektów

Próba użycia obiektu przed jego inicjalizacją (NullPointerException)

Najczęstszy błąd wszech czasów — próba odwołania się do obiektu, który jeszcze nie został utworzony. W Javie zmienne typów referencyjnych domyślnie mają wartość null.

Przykład:

User user;
System.out.println(user.name); // NullPointerException!

Dlaczego?
Zmienna user została zadeklarowana, ale nie zainicjalizowana. Przy próbie odwołania się do pola lub metody — otrzymasz NPE (NullPointerException).

Poprawne podejście:

User user = new User();
System.out.println(user.name); // Teraz wszystko jest OK (o ile pole nie jest null)

Błędy w wywołaniu konstruktora (niedopasowane parametry, brak konstruktora domyślnego)

Jeśli klasa ma tylko konstruktor z parametrami, próba utworzenia obiektu bez parametrów spowoduje błąd kompilacji.

public class Book {
    String title;

    public Book(String title) {
        this.title = title;
    }
}

Book book = new Book(); // Błąd! Brak konstruktora bez parametrów

Rozwiązanie: albo dodać konstruktor bez parametrów, albo zawsze przekazywać wymagane wartości:

Book book = new Book("Java dla bystrzaków");

Wielokrotne tworzenie obiektów zamiast ponownego użycia

Czasem początkujący tworzą nowy obiekt za każdym razem, gdy trzeba się do niego odwołać, zamiast użyć już utworzonego.

Book book = new Book("Java dla bystrzaków");
System.out.println(book.title);

book = new Book("Java dla bystrzaków"); // Po co? Taki obiekt już istniał!
System.out.println(book.title);

To nie jest błąd kompilacji, ale oznaka złego stylu — tracisz referencję do starego obiektu i zużywasz dodatkową pamięć.

3. Best practices: jak unikać pułapek

Zawsze jawnie określaj modyfikatory dostępu

Nie żałuj pisania public, private lub protected — to nie tylko kwestia bezpieczeństwa, ale też czytelności kodu. IDE oczywiście podpowie, ale lepiej od razu wyrobić sobie nawyk.

Przykład:

public class User {
    private String name;
    // ...
}

Dbaj o nazewnictwo klas

  • Nazwa klasy — wielką literą, styl CamelCase: Book, LibraryUser, BookManager.
  • Nazwa pliku — dokładnie taka jak nazwa klasy.

Używaj konstruktorów do inicjalizacji pól obowiązkowych

Jeśli obiekt ma pola, które koniecznie muszą być ustawione przy tworzeniu, dodaj konstruktor z parametrami. To uchroni przed błędami na etapie użycia.

Przykład:

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }
}

Teraz nie da się utworzyć User bez imienia — kompilator na to nie pozwoli.

4. Stosujemy wiedzę: budujemy mini‑aplikację „Biblioteka”

Kontynuujmy rozwijanie naszej aplikacji edukacyjnej. Mamy klasę Book oraz klasę Library, która zarządza książkami.

Przykład poprawnej deklaracji klasy

// Plik Book.java
public class Book {
    private String title;
    private String author;

    // Konstruktor z parametrami
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // Gettery
    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }
}

Przykład poprawnego utworzenia obiektu

Book book = new Book("Java dla bystrzaków", "John Doe");
System.out.println(book.getTitle() + " - " + book.getAuthor());

Przykład klasy‑menedżera

// Plik Library.java
import java.util.ArrayList;

public class Library {
    private ArrayList<Book> books = new ArrayList<>();

    public void addBook(Book book) {
        books.add(book);
    }

    public void printAllBooks() {
        for (Book book : books) {
            System.out.println(book.getTitle() + " - " + book.getAuthor());
        }
    }
}

Użycie w main

public class Main {
    public static void main(String[] args) {
        Library library = new Library();
        Book book1 = new Book("Java dla bystrzaków", "John Doe");
        Book book2 = new Book("OOP w prostych słowach", "John Smith");

        library.addBook(book1);
        library.addBook(book2);

        library.printAllBooks();
    }
}

5. Ilustracje i schematy

Schemat: gdzie co deklarować?

+-----------------------------+
|         Book.java           |
|-----------------------------|
| public class Book {         |
|     private String title;   |  <--- pola (tylko wewnątrz klasy)
|     ...                     |
|     public Book(...) {...}  |  <--- konstruktor (wewnątrz klasy)
|     public String getTitle()|  <--- metody (wewnątrz klasy)
| }                           |
+-----------------------------+

+-----------------------------+
|        Main.java            |
|-----------------------------|
| public class Main {         |
|     public static void main |
|         // Tworzenie obiektów|
|         Book book = new Book|
| }                           |
+-----------------------------+

6. Omówienie typowych błędów

Błąd 1: Niezgodność nazwy klasy i pliku

// Plik: Libraryuser.java
public class LibraryUser { // Nazwa klasy z wielkim U, plik z małej!
    // ...
}

class LibraryUser is public, should be declared in a file named LibraryUser.java

Błąd 2: Próba użycia niezainicjalizowanego obiektu

Book book;
System.out.println(book.getTitle()); // NullPointerException!

Błąd 3: Brak nawiasów klamrowych

public class Book
    private String title; // Pola zwykle są private dla enkapsulacji
    // ...
}

';' expected

Błąd 4: Deklaracja metody wewnątrz metody

public class User {
    public void printName() {
        void sayHello() {
            System.out.println("Hello!"); // Nie wolno deklarować metody wewnątrz metody!
        }
    }
}

illegal start of type

1
Zadanie
JAVA 25 SELF, poziom 23, lekcja 0
Niedostępne
Projektowanie bazy danych uczniów 📚
Projektowanie bazy danych uczniów 📚
1
Zadanie
JAVA 25 SELF, poziom 23, lekcja 0
Niedostępne
Niebezpieczeństwo "pustych" książek w katalogu bibliotecznym 👻
Niebezpieczeństwo "pustych" książek w katalogu bibliotecznym 👻
1
Zadanie
JAVA 25 SELF, poziom 23, lekcja 0
Niedostępne
Metoda wewnątrz metody: Zakaz architektoniczny 🏗️
Metoda wewnątrz metody: Zakaz architektoniczny 🏗️
1
Zadanie
JAVA 25 SELF, poziom 23, lekcja 0
Niedostępne
Obowiązkowe nadanie nazwy nowemu produktowi 🏷️
Obowiązkowe nadanie nazwy nowemu produktowi 🏷️
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION