1. Помилки під час оголошення класу
Відсутність модифікаторів доступу (package-private за замовчуванням)
У Java, якщо ви явно не вказуєте модифікатор доступу в класі, то він стає доступним лише всередині поточного пакета. Це називається package-private або «доступ за замовчуванням». Наприклад:
// Файл Book.java
class Book {
String title;
}
Такий клас не можна використовувати в іншому пакеті. Якщо ви хочете, щоб клас був доступний всюди (а найчастіше саме так і потрібно для основних моделей), використовуйте модифікатор public:
public class Book {
String title;
}
Чому це важливо?
Якщо забути поставити public, ви потім довго дивуватиметеся, чому якийсь Library з іншого пакета не бачить ваш клас.
Невідповідність імені класу та імені файлу
У Java ім’я файлу з класом має збігатися з іменем public‑класу у цьому файлі (з урахуванням регістру!). Наприклад:
// Файл Book.java
public class Book {
// ...
}
Якщо ви назвете файл book.java (з малої літери) або, а ще гірше, BooK.java, компілятор видасть помилку. Це одна з причин, чому IDE так наполягає на відповідності: якщо ви перейменували клас, не забудьте перейменувати й файл.
Помилки в синтаксисі оголошення класу: забуті фігурні дужки, неправильне розташування методів і полів
Java — сувора мова. Якщо забути десь фігурну дужку або випадково оголосити метод усередині іншого методу (так робити не можна!), компілятор негайно повідомить про помилку.
Приклад неправильного оголошення:
public class User
String name; // Пропущено фігурні дужки класу
public void printName() {
System.out.println(name);
}
}
Правильний варіант:
public class User {
String name;
public void printName() {
System.out.println(name);
}
}
Запам’ятайте:
- Усі поля й методи оголошуються лише всередині фігурних дужок класу.
- Методи не можуть бути вкладеними один в одного (у деяких мовах вкладені методи допустимі, але не в Java!).
2. Помилки під час створення об’єктів
Спроба використати об’єкт до його ініціалізації (NullPointerException)
Одна з найпоширеніших помилок — спроба звернутися до об’єкта, який ще не створено. У Java змінні посилального типу за замовчуванням дорівнюють null.
Приклад:
User user;
System.out.println(user.name); // NullPointerException!
Чому?
Змінну user оголошено, але не ініціалізовано. Якщо це локальна змінна — буде помилка компіляції; якщо це поле — під час спроби звернутися до поля або методу отримаєте NPE (NullPointerException).
Правильний підхід:
User user = new User();
System.out.println(user.name); // Тепер усе гаразд (якщо поле не null)
Помилки у виклику конструктора (невідповідність параметрів, відсутність конструктора за замовчуванням)
Якщо в класі є лише конструктор із параметрами, спроба створити об’єкт без параметрів призведе до помилки компіляції.
public class Book {
String title;
public Book(String title) {
this.title = title;
}
}
Book book = new Book(); // Помилка! Немає конструктора без параметрів
Рішення: або додати конструктор без параметрів, або завжди передавати потрібні значення:
Book book = new Book("Java для чайників");
Багаторазове створення об’єктів замість повторного використання
Іноді новачки створюють новий об’єкт щоразу, коли потрібно до нього звернутися, замість того щоб використовувати вже створений.
Book book = new Book("Java для чайників");
System.out.println(book.title);
book = new Book("Java для чайників"); // Навіщо? Уже був такий об’єкт!
System.out.println(book.title);
Це не помилка компіляції, але ознака поганого стилю — ви втрачаєте посилання на старий об’єкт і витрачаєте зайву пам’ять.
3. Найкращі практики: як не наступати на граблі
Завжди явно вказуйте модифікатори доступу
Не лінуйтеся писати public, private або protected — це не лише про безпеку, а й про читабельність коду. IDE, звісно, підкаже, але краще виробити звичку відразу.
Приклад:
public class User {
private String name;
// ...
}
Дотримуйтеся правил найменування класів
- Ім’я класу — з великої літери, стиль CamelCase: Book, LibraryUser, BookManager.
- Ім’я файлу — точно як ім’я класу.
Використовуйте конструктори для ініціалізації обов’язкових полів
Якщо об’єкт має поля, які обов’язково мають бути заповнені під час створення, додайте конструктор із параметрами. Це захистить від помилок на етапі використання.
Приклад:
public class User {
private String name;
public User(String name) {
this.name = name;
}
}
Тепер не можна створити User без імені — компілятор не дозволить.
4. Застосовуємо знання: будуємо міні‑застосунок «Бібліотека»
Продовжмо розвивати наш навчальний застосунок. Нехай у нас є клас Book і клас Library, який керує книгами.
Приклад правильного оголошення класу
// Файл Book.java
public class Book {
private String title;
private String author;
// Конструктор із параметрами
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// Гетери
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
}
Приклад правильного створення об’єкта
Book book = new Book("Java для чайників", "Джон Доу");
System.out.println(book.getTitle() + " - " + book.getAuthor());
Приклад класу‑менеджера
// Файл 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());
}
}
}
Використання в main
public class Main {
public static void main(String[] args) {
Library library = new Library();
Book book1 = new Book("Java для чайників", "Джон Доу");
Book book2 = new Book("ООП на пальцях", "Іван Петренко");
library.addBook(book1);
library.addBook(book2);
library.printAllBooks();
}
}
5. Ілюстрації та схеми
Схема: де що оголошувати?
+-----------------------------+
| Book.java |
|-----------------------------|
| public class Book { |
| private String title; | <--- поля (лише всередині класу)
| ... |
| public Book(...) {...} | <--- конструктор (всередині класу)
| public String getTitle()| <--- методи (всередині класу)
| } |
+-----------------------------+
+-----------------------------+
| Main.java |
|-----------------------------|
| public class Main { |
| public static void main |
| // Створення об’єктів|
| Book book = new Book|
| } |
+-----------------------------+
6. Розбір типових помилок
Помилка 1: Невідповідність імені класу та файлу
// Файл: Libraryuser.java
public class LibraryUser { // Ім’я класу — з великої U, а файл — з малої літери!
// ...
}
class LibraryUser is public, should be declared in a file named LibraryUser.java
Помилка 2: Спроба використати неініціалізований об’єкт
Book book;
System.out.println(book.getTitle()); // NullPointerException!
Помилка 3: Забули фігурні дужки
public class Book
private String title; // Поля зазвичай роблять private для інкапсуляції
// ...
}
';' expected
Помилка 4: Оголошення методу всередині методу
public class User {
public void printName() {
void sayHello() {
System.out.println("Hello!"); // Не можна оголошувати метод всередині методу!
}
}
}
illegal start of type
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ