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.

为了解决这个问题,我可以scanner = new...在 try/catch 语句中加入一行:

    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"));
    }

这是一种假设情况。请不要说“你为什么要那样做?” 或“这是制作扫描仪的更好方法!”

4

2 回答 2

7

JLS §11.2.3

如果命名类或接口的类变量初始值设定项 (§8.3.2) 或静态初始值设定项 (§8.7)可以抛出检查异常类,则为编译时错误。

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

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

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

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

于 2014-01-24T00:07:59.230 回答
6

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

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

于 2014-01-24T00:06:40.493 回答