У меня возникают некоторые проблемы с пониманием различий между исключениями checked
и unchecked
в Java.
- Во-первых, исключения
checked
предполагают поиск аномалий во время компиляции. Примеры, представленные в разных источниках, ссылаются на подключение к базам данных, обработку файлов как некоторые из них, в то время как исключенияunchecked
должны искать ошибки в части программиста, такие как индексирование за пределами диапазона массива и т.д.
Разве это не должно быть наоборот? Я имею в виду, что подключение к базам данных выполняется во время выполнения, правильно? То же самое касается обработки файлов. Во время компиляции вы не открываете файл-дескриптор, поэтому почему во время компиляции возникает ошибка? С другой стороны, индексирование массива за пределами его диапазона уже выполняется в программе, которое может быть проверено во время компиляции (если аномальный индекс предоставляется пользователем во время выполнения, тогда это нормально, чтобы он был временем выполнения проблема). Что мне здесь не хватает?
2 Во-вторых, как RunTimeException
, сам являющийся unchecked
, подкласс Exception
, который checked
? Что это означает?
Я нашел пример в книге Герберта Шильдта, объясняющей использование исключений checked
:
class ThrowsDemo {
public static char prompt(String str)
throws java.io.IOException {
System.out.print(str + ": ");
return (char) System.in.read();
}
public static void main(String args[]) {
char ch;
try {
ch = prompt("Enter a letter");
}
catch(java.io.IOException exc) {
System.out.println("I/O exception occurred.");
ch = 'X';
}
System.out.println("You pressed " + ch);
}
}
Требуется ли здесь предложение throws
? Почему я не могу это сделать обычно с инструкцией try-catch
вроде этого (извините, я не знаю, как имитировать IO Exception
, так что не мог проверить это сам!):
class ThrowsDemo {
public static char prompt(String str) {
System.out.print(str + ": ");
return (char) System.in.read();
}
public static void main(String args[]) {
char ch;
try {
ch = prompt("Enter a letter");
}
catch(java.io.IOException exc) {
System.out.println("I/O exception occurred.");
ch = 'X';
}
System.out.println("You pressed " + ch);
}
}