← Назад к вопросам
Как называется непроверяемый класс, наследуемый от 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, которые ТРЕБУЮТ обработки и указывают на проблемы окружения (нет файла, нет соединения с БД и т.д.).