0

考虑以下陈述

BufferedReader br=new BufferedReader(new FileReader("D:\\test.txt"));

通常我们必须throws Exception或必须使用try-catch来处理Exception.

但是,如果我想在静态块中使用它,如下所示。唯一能做的就是使用try-catch块来处理Exception. 但是这里不能用throws吗?java这里没有提供背后的原因是什么throws

  static {
    try {
        BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
  }

让我也添加这个。块不是静态块的情况类似规则在这里适用。

 {
    try {
        BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

我们通常可以通过以下方法执行此操作

    public static void main(String[] args) throws FileNotFoundException {
    BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
     }
4

4 回答 4

6

这是一个在类初始化时运行的静态块。因为它是一个检查异常,所以你不能抛出它,因为没有地方可以捕获它。
抛出未经检查的异常是可能的,但它会使程序崩溃,因为在任何地方都无法捕获。

相反,您可以将代码放在

public static void init() throws FileNotFoundException
{
   BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
}

然后在您的程序启动时调用一次。

编辑:删除static关键字不会改变编译结果中的任何内容。这只是允许它丢失的语法。

于 2013-09-18T12:45:35.053 回答
0

好吧,static当你的类被加载时(通常在 JVM 启动之后)运行这样的代码块,所以在这里抛出异常会破坏你的整个 java 程序,因为你无法在任何地方捕获它

于 2013-09-18T12:46:04.153 回答
0

由于转义块的异常static会导致ExceptionInInitializerError.

换句话说,不要让异常从静态初始化程序中逃逸 - 而是处理它们。

于 2013-09-18T12:46:25.500 回答
0

您可以从 init 块中引发异常,但它应该是未经检查的异常。你能做的就是这个

static {
    try {
        BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
    } catch (FileNotFoundException e) {
        throw new IllegalStateException(e);
    }
}
于 2013-09-18T12:48:25.837 回答