JavaRush /Курсы /JAVA 25 SELF /Ошибки при объявлении классов и объектов

Ошибки при объявлении классов и объектов

JAVA 25 SELF
23 уровень , 0 лекция
Открыта

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

1
Задача
JAVA 25 SELF, 23 уровень, 0 лекция
Недоступна
Проектирование ученической базы данных 📚
Проектирование ученической базы данных 📚
1
Задача
JAVA 25 SELF, 23 уровень, 0 лекция
Недоступна
Опасность "пустых" книг в библиотечном каталоге 👻
Опасность "пустых" книг в библиотечном каталоге 👻
1
Задача
JAVA 25 SELF, 23 уровень, 0 лекция
Недоступна
Метод внутри метода: Архитектурный запрет 🏗️
Метод внутри метода: Архитектурный запрет 🏗️
1
Задача
JAVA 25 SELF, 23 уровень, 0 лекция
Недоступна
Обязательное именование нового товара 🏷️
Обязательное именование нового товара 🏷️
Комментарии (7)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Yury Lyutov Уровень 25
22 февраля 2026
Последняя задача решается без единой строчки написанного кода, так как все уже есть - в чем ее смысл? Уберите все что написано и оставьте условие, что бы хоть что то можно было написать самостоятельно
Big198801 Уровень 33
6 ноября 2025
В первой задаче решение не проходит валидацию по второму требованию - просит, чтобы файл Student.java был размещен в пакете "ru.rush.java.core.level23.task01", хотя задачи решаются в пакете "ru.javarush.java.core.level23.task01". Несостыковка в пакетах javarush и rush.java
qaruller Уровень 21
16 января 2026
Поправили вроде
Andrey Уровень 1
19 сентября 2025
23
nastya_zhadan Уровень 66
24 сентября 2025
мое любимое число
Anton Pohodin Уровень 27
12 октября 2025
Моё тоже)
Ioanna Polyak Уровень 44
6 ноября 2025
мое любимое число - 733