如果我写这样的话:
public static void main(String[] args) {
try {
} catch (MalformedURLException e) {
e.printStackTrace()
};
}
Java编译器在MalformedURLException
的catch子句中显示编译错误。如果我插入行
尝试阻止URL url = new URL("HI");
,抱怨停止。我认为java必须使用包绑定这些已检查的异常。然后我通过在try块中插入“CookieManager manager = new CookieManager();
”来尝试另一类java.net包。再次开始编译错误。
那么JVM如何将这些已检查的异常与java类绑定,以便编译这样的编译时错误?
答案 0 :(得分:5)
方法声明指定方法抛出的异常。编译器可以访问此信息。如果您尝试捕获try子句中调用的代码无法抛出的异常,编译器将发出错误消息。
答案 1 :(得分:4)
如果选中Checked Exceptions,必须先捕获一些内容!
public static void main(String[] args) {
try {
} catch (MalformedURLException e) {
e.printStackTrace()
};
}
在这种情况下,不可能抛出异常而无法捕获它。
添加
时URL url = new URL("HI");
构造函数抛出异常,因此您需要捕获它。
public URL(String protocol, String host, int port, String file)
throws MalformedURLException
{
this(protocol, host, port, file, null);
}
但是CookieManager构造函数不会抛出任何异常。所以没必要抓住它。
/**
* Create a new cookie manager.
*
* <p>This constructor will create new cookie manager with default
* cookie store and accept policy. The effect is same as
* <tt>CookieManager(null, null)</tt>.
*/
public CookieManager() {
this(null, null);
}
答案 2 :(得分:3)
对于每个方法,已检查的异常都保存在类文件中。
当您使用检查异常调用此类方法时,编译器会检查您是捕获异常还是从方法中抛出异常。
答案 3 :(得分:2)
来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21:
14.21。无法访问的语句
如果由于无法访问语句而无法执行该语句,则为编译时错误。
...
如果满足以下两个条件,则可以访问catch块C:
- C参数的类型是未经检查的异常类型或Throwable;或者try块中的某些表达式或throw语句是可以访问的,并且可以抛出一个已检查的异常,其类型可分配给catch子句C的参数。
如果包含它的最内层语句可以访问,则表达式是可到达的。
表达式的正常和突然完成见§15.6。
- 在try语句中没有早期的catch块,因此C的参数类型与A参数类型的子类相同。
如果try块为空,则第一个条件不成立:没有任何内容可以“抛出一个类型可赋值给catch子句C的参数的已检查异常”。
答案 4 :(得分:0)
这只是Java的超级警惕编译器抱怨:如果你没有抛出任何异常,你没有调用任何抛出它的代码,那么为什么你有一个无用的try-catch块坐在浪费空间?< / em>
因此,当您让编译器有理由相信此块中可能发生异常时,它会关闭。