我在理解 Java 中的差异checked
和unchecked
异常方面遇到了一些问题。
- 首先,
checked
异常应该在编译期间寻找异常。不同来源中提供的示例引用了数据库连接、文件处理作为其中的一些,而unchecked
异常应该查找程序员方面的错误,例如超出数组范围的索引等。
不应该反过来吗?我的意思是,数据库连接是在运行时完成的,对吧?文件处理也是如此。您不会在编译期间打开文件句柄,那么为什么在编译期间寻找可能的错误呢?另一方面,超出范围的数组的索引已经在程序中完成,可以在编译时检查(如果异常索引是用户在运行时提供的,那么它可以是运行时问题)。我在这里想念什么?
2 其次,怎么可能RunTimeException
,本身就是unchecked
,子类Exception
,哪个是checked
?这意味着什么?
我在 Herbert Schildt 的书中找到了一个解释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);
}
}