【发布时间】:2012-12-23 14:28:24
【问题描述】:
我在理解 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);
}
}
【问题讨论】:
-
检查的异常不能检测编译时问题。这就是编译器错误的目的。