1

如果我写这样的东西:

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

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

那么对于像这样的编译时错误,JVM 是如何将这些检查异常与 java 类绑定的呢?

4

5 回答 5

5

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

于 2013-08-07T12:08:14.863 回答
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);
}
于 2013-08-07T12:08:56.813 回答
3

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

当您使用已检查的异常调用此类方法时,编译器会检查您是捕获异常还是从方法中抛出异常。

于 2013-08-07T12:07:53.310 回答
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 块为空,则第一个条件不成立:没有任何东西“可以抛出类型可分配给 catch 子句 C 的参数的已检查异常”。

于 2013-08-07T12:28:32.890 回答
0

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

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

于 2013-08-07T12:41:12.973 回答