静态代码块能否抛出异常?

9
假设有这样一个情况,我有一个类像这样:
import java.io.File;
import java.util.Scanner;
class X
{
    static Scanner scanner;
    static
    {
        scanner = new Scanner(new File("X.txt"));
    }
}

编译时,我得到了以下错误信息:
未报告的例外java.io.FileNotFoundException; 必须捕获或声明抛出。
因为public Scanner(File source) throws FileNotFoundException
要解决这个问题,我可以在try/catch语句中放置scanner = new...行。
    static
    {
        try
        {
            scanner = new Scanner(new File("X.txt"));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

然而,我能否有任何方式做一些类似的事情:
    static throws java.io.FileNotFoundException
    {
        scanner = new Scanner(new File("X.txt"));
    }

这是一个假设情境。请不要说“为什么你想这样做?”或者“有更好的方法来制作扫描仪!”

坦白地说,我在这里看不到问题。 - Josh M
2个回答

7

来自JLS §11.2.3

如果命名类或接口的类变量初始化器(§8.3.2)或静态初始化器(§8.7)可能抛出一个已检查异常类,则会在编译时出现错误。

为了完整起见,未经检查的异常在JLS §11.1.1中定义:

RuntimeException和它的所有子类被统称为运行时异常类。

未经检查的异常类是运行时异常类和错误类。

这是唯一可以从静态初始化器中抛出的异常类型。


6

静态代码块不能抛出已检查异常,您可以捕获已检查的异常,适当记录并抛出运行时异常。您需要将已检查的异常嵌套为根本原因。

但是,您最终收到的异常将是某种ClassInitializationException形式,并且您可以查看嵌套异常以确定根本原因。


请问您能否添加一个代码示例? - MasterJoe
3
“某种类型的ClassInitializationException”实际上是一个Error,且不可恢复。因此,抛出一个未经检查的异常是非常糟糕的做法。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接