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
GO TO FULL VERSION