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

时间:2014-01-24 00:02:51

标签: java static try-catch throws static-block

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

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

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

2 个答案:

答案 0 :(得分:7)

来自JLS §11.2.3

  

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

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

  

RuntimeException及其所有子类统称为运行时异常类。

     

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

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

答案 1 :(得分:6)

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

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