静态代码块可以抛出异常吗?

The*_*Hat 8 java static static-block try-catch throws

在假设的情况下,我有一个这样的课:

import java.io.File;
import java.util.Scanner;
class X
{
    static Scanner scanner;
    static
    {
        scanner = new Scanner(new File("X.txt"));
    }
}
Run Code Online (Sandbox Code Playgroud)

在编译时,我明白了

未报告的例外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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,我有什么方法可以做到这样的事情:

    static throws java.io.FileNotFoundException
    {
        scanner = new Scanner(new File("X.txt"));
    }
Run Code Online (Sandbox Code Playgroud)

这是一个假设的情况.请不要说"那你为什么要那样做?" 或者"这是制作扫描仪的更好方法!"

ars*_*jii 7

来自JLS§11.2.3:

如果命名类或接口的类变量初始化程序(第8.3.2节)或静态初始化程序(第8.7节)可以抛出已检查的异常类,则会发生编译时错误.

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

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

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

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


小智 6

静态代码块不能抛出Checked Exceptions,您可以捕获已检查的异常,正确记录它并抛出Runtime Exception.您可能希望将已检查的异常嵌套为根本原因.

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

  • “某种‘ClassInitializationException’”实际上是一个‘Error’,而且是不可恢复的。因此抛出未经检查的异常是一个非常糟糕的主意。 (2认同)