java如何检测Checked Exceptions?

时间:2013-08-07 12:04:55

标签: java exception jvm checked-exceptions

如果我写这样的话:

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类绑定,以便编译这样的编译时错误?

5 个答案:

答案 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>

因此,当您让编译器有理由相信此块中可能发生异常时,它会关闭。