当我尝试在实例初始化(而不是类初始化)块中抛出异常时,我得到错误:
initializer must be able to complete normally
Run Code Online (Sandbox Code Playgroud)
尽管Java本身就是这样,为什么不允许这样做?
以下示例创建了四个类.A由于ArithmeticException ,该类在实例化期间失败.这可以用和处理catch.B与NullPointerException失败的相同.但是当我尝试自己抛出一个NullPointerException时,因为在C程序中没有编译.当我尝试定义自己的RuntimeException时,我得到了同样的错误D.所以:
我怎么能像Java一样做?
// -*- compile-command: "javac expr.java && java expr"; -*-
class expr
{
class A
{
int y;
{{ y = 0 / 0; }}
}
class B
{
Integer x = null;
int y;
{{ y = x.intValue(); }}
}
class C
{
{{ throw new NullPointerException(); }}
}
class Rex extends RuntimeException {}
class D
{
{{ …Run Code Online (Sandbox Code Playgroud) 在假设的情况下,我有一个这样的课:
import java.io.File;
import java.util.Scanner;
class X
{
static Scanner scanner;
static
{
scanner = new Scanner(new File("X.txt"));
}
}
Run Code Online (Sandbox Code Playgroud)
在编译时,我明白了
未报告的例外
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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我有什么方法可以做到这样的事情:
static throws java.io.FileNotFoundException
{
scanner = new Scanner(new File("X.txt"));
}
Run Code Online (Sandbox Code Playgroud)
这是一个假设的情况.请不要说"那你为什么要那样做?" 或者"这是制作扫描仪的更好方法!"
我不会抛出任何异常static。
static
{
try
{
int number = Integer.parseInt("2a");
}
catch (NumberFormatException e)
{
//log
}
}
Run Code Online (Sandbox Code Playgroud)
为什么在这种情况下使用 try 和 catch 被认为是错误的?