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
手动加载类?不,你不能,因为处理类初始化的不是你的代码。但它只是表明您可以让异常逃逸静态块,它不能是一个已检查的异常。