考虑以下陈述
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"));
}
答案 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);
}
}