Java 为什么可以';这里不使用抛出异常?
考虑下面的陈述Java 为什么可以';这里不使用抛出异常?,java,exception-handling,Java,Exception Handling,考虑下面的陈述 BufferedReader br=new BufferedReader(new FileReader("D:\\test.txt")); 通常我们必须抛出异常,或者我们必须使用try catch来处理异常 但是如果我想在静态块中使用它,如下所示。唯一能做的就是使用try-catch块来处理异常。但是不能在这里使用抛出?java没有在这里提供throws的原因是什么 static { try { BufferedReader br = new Buf
BufferedReader br=new BufferedReader(new FileReader("D:\\test.txt"));
通常我们必须抛出异常
,或者我们必须使用try catch
来处理异常
但是如果我想在静态块中使用它,如下所示。唯一能做的就是使用try-catch
块来处理异常。但是不能在这里使用抛出?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"));
}
它是在初始化类时运行的静态块。由于它是一个已检查的异常,您无法抛出它,因为没有地方可以捕获它。
抛出一个未检查的异常是可能的,但它会使程序崩溃,因为这两个异常都不能在任何地方被捕获
相反,您可以将代码放入
public static void init() throws FileNotFoundException
{
BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
}
然后在程序启动时调用一次
编辑:删除static
关键字不会改变编译结果中的任何内容。只是语法允许它丢失。它是初始化类时运行的静态块。由于它是一个已检查的异常,您无法抛出它,因为没有地方可以捕获它。
抛出一个未检查的异常是可能的,但它会使程序崩溃,因为这两个异常都不能在任何地方被捕获
相反,您可以将代码放入
public static void init() throws FileNotFoundException
{
BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
}
然后在程序启动时调用一次
编辑:删除static
关键字不会改变编译结果中的任何内容。这只是语法允许它丢失。好吧,静态
这样的代码块是在类加载时运行的(通常在JVM启动后),所以在这里抛出exeption会破坏整个java程序,因为你无法在任何地方捕获它。好吧,静态
这样的代码块是在类加载时运行的(通常在JVM启动之后),因此在这里抛出exeption会破坏整个java程序,因为您无法在任何地方捕获它,因为逃逸静态块的异常会导致异常InInitializerRor
换句话说,不要让异常从静态初始值设定项中逃逸,而是处理它们。因为逃逸静态
块的异常将导致异常InInitializerRor
换句话说,不要让异常从静态初始值设定项中逃逸,而是处理它们。您可以从init块抛出异常,但它应该是未经检查的异常。您可以这样做
static {
try {
BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
} catch (FileNotFoundException e) {
throw new IllegalStateException(e);
}
}
您可以从init块抛出异常,但它应该是未经检查的异常
static {
try {
BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));
} catch (FileNotFoundException e) {
throw new IllegalStateException(e);
}
}
FWIW:在类的静态初始化期间打开FileReader
将被视为一件坏事(tm)。;-)只是为了给您提供语言规范参考:FWIW:在类的静态初始化期间打开FileReader
将被视为一件坏事(tm)。;-)只是给你一个语言规范参考:“…当JVM启动时…”不,当类加载时,这可能需要很长时间。”…当JVM启动时…”不,当类加载时,这可能需要很长时间。“没有地方可以抛出异常”是不正确的。您仍然可以抛出未经检查的异常。问题是您不能指定throws子句,因为这没有多大意义。例如,您仍然可以将其包装在RuntimeException中。@Kayaman但是您能捕获您抛出的未经检查的异常吗?我相信不会,除非你用ClassLoader
手动加载类?不,你不能,因为处理类初始化的不是你的代码。但是它只是表明你可以让异常逃逸静态块,它不能是一个检查过的异常。“没有地方可以抛出异常”是不正确的。您仍然可以抛出未经检查的异常。问题是您不能指定throws子句,因为这没有多大意义。例如,您仍然可以将其包装在RuntimeException中。@Kayaman但是您能捕获您抛出的未经检查的异常吗?我相信不会,除非你用ClassLoader
手动加载类?不,你不能,因为处理类初始化的不是你的代码。但它只是表明您可以让异常逃逸静态块,它不能是一个已检查的异常。