为什么不能使用throws Exception?

时间:2013-09-18 12:43:50

标签: java exception-handling

考虑以下陈述

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

通常我们必须throws Exception,否则我们必须使用try-catch来处理Exception

但是如果我想在静态块中使用它,如下所示。唯一能做的就是使用try-catch块来处理Exception。但是不能在这里使用throwsjava在此处未提供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 个答案:

答案 0 :(得分:6)

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

相反,您可以将代码放在

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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