2013-08-07 44 views
1

如果我这样写:java如何检测检查异常?

public static void main(String[] args) { 
    try { 
    } catch (MalformedURLException e) { 
     e.printStackTrace() 
    }; 
} 

Java编译器显示编译错误在MalformedURLException catch子句。如果我在try块中插入行 URL url = new URL("HI");,抱怨停止。我认为java必须将这些检查过的异常与包绑定。然后,我尝试了另一类java.net包,只在try块中插入“CookieManager manager = new CookieManager();”。编译错误再次开始。

那么JVM如何将这些检查过的异常与java类绑定在一起编译时间错误呢?

回答

5

方法声明指定方法抛出哪些异常。编译器可以访问这些信息。如果您试图捕获try子句中调用的代码无法抛出的异常,编译器会发出错误消息。

3

对于每种方法,将检查的异常保存到类文件中。

当你用检查异常调用这样一个方法时,编译器会检查你是否捕获异常或将它从你的方法中抛出。

4

在检查异常的情况下,必须在被捕获之前抛出一些东西!

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

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块A,使得C的参数类型与A的参数类型相同或是其类型的子类。

的第一个条件,如果try块是空是不正确的:没有什么东西是“可以抛出checked异常,它的类型是分配给catch子句C的参数”。

0

这只是Java的超级警惕编译器抱怨:如果你没有抛出任何异常,你没有调用任何抛出它的代码,那么为什么你有一个无用的try-catch块坐在浪费的空间?

因此,当你给编译器一个理由认为在这个块中可能发生异常时,它会关闭。