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. Best practices: как не наступать на грабли
Всегда явно указывайте модификаторы доступа
Не ленитесь писать 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
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ