← Назад к вопросам

Как называется непроверяемый класс, наследуемый от Exception

1.0 Junior🔥 71 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как называется непроверяемый класс, наследуемый от Exception

Ответ: RuntimeException

Иерархия исключений в Java

                    Throwable
                        |
            ┌───────────┴───────────┐
            |                       |
         Error                  Exception
    (никогда не              (проверяемые и
     ловим)                 непроверяемые)
                    |
        ┌───────────┴───────────┐
        |                       |
  RuntimeException    Checked Exception
  (непроверяемые)     (проверяемые)
        |
    ┌───┴─────┬──────────┬──────────┐
    |         |          |          |
  NullPointer ClassCast Index Array Index Out Of Bounds
  Exception   Exception  Exception  Exception

1. RuntimeException — непроверяемое исключение

RuntimeException и его подклассы НЕ требуют обработки в try-catch или объявления в throws:

public class RuntimeExceptionExample {
    // ✅ Можно не обрабатывать RuntimeException
    public void dividNumbers(int a, int b) {
        int result = a / b; // ArithmeticException при b=0
        System.out.println(result);
    }
    
    // ✅ Можно не объявлять в throws
    public String getFirstChar(String text) {
        return text.charAt(0); // StringIndexOutOfBoundsException
    }
    
    // ✅ Компилятор НЕ требует обработку
    public void processUser(User user) {
        System.out.println(user.getName()); // NullPointerException
    }
}

Частые RuntimeException:

public class RuntimeExceptionsExample {
    public static void main(String[] args) {
        // 1. NullPointerException
        String text = null;
        text.length(); // java.lang.NullPointerException
        
        // 2. ArithmeticException
        int result = 10 / 0; // java.lang.ArithmeticException: / by zero
        
        // 3. ArrayIndexOutOfBoundsException
        int[] arr = {1, 2, 3};
        int val = arr[10]; // java.lang.ArrayIndexOutOfBoundsException
        
        // 4. ClassCastException
        Object obj = "hello";
        Integer num = (Integer) obj; // java.lang.ClassCastException
        
        // 5. IllegalArgumentException
        Thread thread = new Thread();
        thread.setPriority(100); // java.lang.IllegalArgumentException
        
        // 6. NumberFormatException
        Integer.parseInt("not a number"); // java.lang.NumberFormatException
        
        // 7. ConcurrentModificationException
        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        for (String item : list) {
            list.remove(item); // ConcurrentModificationException
        }
        
        // 8. UnsupportedOperationException
        List<String> immutable = Collections.unmodifiableList(new ArrayList<>());
        immutable.add("item"); // UnsupportedOperationException
    }
}

2. Checked Exception — проверяемое исключение

Другие Exception (не RuntimeException) ТРЕБУЮТ обработки:

public class CheckedExceptionExample {
    // ❌ ОШИБКА КОМПИЛЯЦИИ: IOException не обработан
    // public void readFile() {
    //     FileInputStream fis = new FileInputStream("file.txt");
    // }
    
    // ✅ ПРАВИЛЬНО: обработан в try-catch
    public void readFile() throws IOException {
        FileInputStream fis = new FileInputStream("file.txt");
        fis.close();
    }
    
    // ✅ ИЛИ объявлен в throws
    public void readFile() {
        try {
            FileInputStream fis = new FileInputStream("file.txt");
            fis.close();
        } catch (IOException e) {
            System.err.println("Error reading file: " + e.getMessage());
        }
    }
}

Частые Checked Exception:

public class CheckedExceptionsExample {
    public static void main(String[] args) {
        // 1. IOException — проблемы с файлами
        try {
            FileInputStream fis = new FileInputStream("file.txt");
        } catch (IOException e) {
            System.out.println("File not found: " + e.getMessage());
        }
        
        // 2. SQLException — ошибки БД
        try {
            Connection conn = DriverManager.getConnection(url);
        } catch (SQLException e) {
            System.out.println("Database error: " + e.getMessage());
        }
        
        // 3. ClassNotFoundException — класс не найден
        try {
            Class<?> clazz = Class.forName("com.example.MyClass");
        } catch (ClassNotFoundException e) {
            System.out.println("Class not found: " + e.getMessage());
        }
        
        // 4. InterruptedException — поток прерван
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("Thread interrupted: " + e.getMessage());
        }
        
        // 5. ParseException — ошибка парсинга
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            sdf.parse("invalid-date");
        } catch (ParseException e) {
            System.out.println("Parse error: " + e.getMessage());
        }
    }
}

3. Разница между RuntimeException и Checked Exception

┌──────────────────────┬────────────────┬──────────────────┐
│ Характеристика       │ RuntimeException│ Checked Exception│
├──────────────────────┼────────────────┼──────────────────┤
│ Наследуется от       │ RuntimeException│ Exception        │
├──────────────────────┼────────────────┼──────────────────┤
│ Требует обработки    │ НЕТ            │ ДА               │
├──────────────────────┼────────────────┼──────────────────┤
│ Требует throws       │ НЕТ            │ ДА               │
├──────────────────────┼────────────────┼──────────────────┤
│ Проверяется при      │ RUNTIME        │ COMPILE TIME     │
│ компиляции           │                │                  │
├──────────────────────┼────────────────┼──────────────────┤
│ Обычно вызвано       │ Программистом  │ Системой/средой  │
├──────────────────────┼────────────────┼──────────────────┤
│ Примеры              │ NPE, Division  │ IOException,     │
│                      │ by Zero,       │ SQLException     │
│                      │ Cast Exception │                  │
└──────────────────────┴────────────────┴──────────────────┘

4. Создание собственных исключений

Непроверяемое исключение (RuntimeException)

// ✅ Собственное непроверяемое исключение
public class InvalidUserException extends RuntimeException {
    public InvalidUserException(String message) {
        super(message);
    }
    
    public InvalidUserException(String message, Throwable cause) {
        super(message, cause);
    }
}

// Использование
public class UserValidator {
    public void validateUser(User user) {
        if (user == null) {
            throw new InvalidUserException("User cannot be null");
        }
        if (user.getName() == null || user.getName().isEmpty()) {
            throw new InvalidUserException("User name is required");
        }
    }
}

// Вызов (не нужно обрабатывать)
public void processUser(User user) {
    validator.validateUser(user);
    // ...
}

Проверяемое исключение (Exception)

// ✅ Собственное проверяемое исключение
public class DatabaseException extends Exception {
    private int errorCode;
    
    public DatabaseException(String message, int errorCode) {
        super(message);
        this.errorCode = errorCode;
    }
    
    public int getErrorCode() {
        return errorCode;
    }
}

// Использование
public class UserRepository {
    public User findById(Long id) throws DatabaseException {
        try {
            // код работы с БД
            return null;
        } catch (SQLException e) {
            throw new DatabaseException("Failed to find user", 500);
        }
    }
}

// Вызов (НУЖНО обрабатывать)
public void processUser(Long userId) {
    try {
        User user = repository.findById(userId);
    } catch (DatabaseException e) {
        System.out.println("DB error: " + e.getErrorCode());
    }
}

5. Best Practices: когда что использовать

// ✅ ХОРОШО: RuntimeException для логических ошибок
public class ShoppingCart {
    public void addItem(CartItem item) {
        if (item == null) {
            throw new IllegalArgumentException("Item cannot be null");
        }
        // add item
    }
}

// ✅ ХОРОШО: Exception для внешних проблем (I/O, Network, DB)
public class FileStorage {
    public void save(String filename, String content) throws IOException {
        try (FileWriter writer = new FileWriter(filename)) {
            writer.write(content);
        } // IOException будет пробросан
    }
}

// ❌ ПЛОХО: не создавай собственные Checked Exception без причины
public class BadExample {
    public void process() throws MyCustomCheckedException {
        // это усложняет код без пользы
    }
}

// ✅ ХОРОШО: оборачивай Checked Exception в RuntimeException если нужно
public class BetterExample {
    public void process() {
        try {
            // code
        } catch (IOException e) {
            throw new RuntimeException("Failed to process", e);
        }
    }
}

6. Иерархия и правила наследования

public class ExceptionHierarchyExample {
    public static void main(String[] args) {
        // RuntimeException — для программиста
        // - NullPointerException
        // - IllegalArgumentException
        // - IllegalStateException
        // - IndexOutOfBoundsException
        // - ArithmeticException
        // - ClassCastException
        // - ConcurrentModificationException
        
        // Checked Exception — для системы
        // - IOException (и подклассы)
        // - SQLException
        // - ClassNotFoundException
        // - InterruptedException
        // - ReflectiveOperationException
        // - ParseException
    }
}

7. Обработка обоих типов

public class ExceptionHandlingBestPractice {
    public void processFile(String filename, Long userId) {
        try {
            // Может выбросить IOException (Checked)
            String content = readFile(filename);
            
            // Может выбросить RuntimeException (Unchecked)
            validateContent(content);
            
            // Может выбросить SQLException (Checked)
            saveToDatabase(content, userId);
            
        } catch (IOException e) {
            // Обработка I/O ошибок
            System.err.println("IO error: " + e.getMessage());
        } catch (SQLException e) {
            // Обработка БД ошибок
            System.err.println("Database error: " + e.getMessage());
        } catch (IllegalArgumentException e) {
            // Обработка RuntimeException (логическая ошибка)
            System.err.println("Validation error: " + e.getMessage());
        }
    }
    
    private String readFile(String filename) throws IOException {
        // может выбросить IOException
        return new String(Files.readAllBytes(Paths.get(filename)));
    }
    
    private void validateContent(String content) {
        // может выбросить RuntimeException
        if (content == null || content.isEmpty()) {
            throw new IllegalArgumentException("Content cannot be empty");
        }
    }
    
    private void saveToDatabase(String content, Long userId) throws SQLException {
        // может выбросить SQLException
        // code
    }
}

Вывод

RuntimeException — это непроверяемое исключение, которое НЕ требует обработки или объявления в throws. Оно наследуется от Exception и обычно указывает на ошибку программиста (null pointer, неверный аргумент и т.д.).

В отличие от Checked Exception, которые ТРЕБУЮТ обработки и указывают на проблемы окружения (нет файла, нет соединения с БД и т.д.).