何时在Java方法声明中使用抛出?

何时在Java方法声明中使用抛出?,java,exception-handling,throws,Java,Exception Handling,Throws,所以我认为我对Java中的异常处理有很好的基本理解,但最近我读了一些代码,这些代码让我感到困惑和怀疑。我想在这里提出的主要疑问是,一个人应该在什么时候使用抛出式Java方法声明,如下所示: public void method() throws SomeException { // method body here } 通过阅读一些类似的文章,我收集到throws被用作一种声明,声明在方法执行期间可以抛出SomeException 我的困惑来自如下代码

所以我认为我对Java中的异常处理有很好的基本理解,但最近我读了一些代码,这些代码让我感到困惑和怀疑。我想在这里提出的主要疑问是,一个人应该在什么时候使用抛出式Java方法声明,如下所示:

    public void method() throws SomeException
    {
         // method body here
    }
通过阅读一些类似的文章,我收集到throws被用作一种声明,声明在方法执行期间可以抛出SomeException

我的困惑来自如下代码:

     public void method() throws IOException
     {
          try
          {
               BufferedReader br = new BufferedReader(new FileReader("file.txt"));
          }
          catch(IOException e)
          {
               System.out.println(e.getMessage());
          }
     }

在本例中,您是否有任何理由希望使用抛出?如果您只是在对IOException之类的东西进行基本的异常处理,那么您只需要try/catch块,就是这样。

如果您正在捕获异常类型,您不需要抛出它,除非您要重新抛出它。在您发布的示例中,开发人员应该做一个或另一个,而不是两个都做

通常,如果您不打算对异常执行任何操作,则不应捕获它

你能做的最危险的事情就是抓住一个异常而不处理它

关于何时抛出异常是合适的,这里有一个很好的讨论


你是对的,在那个例子中,
抛出的
是多余的。它可能是从以前的某个实现中遗留下来的-可能异常最初是抛出的,而不是在catch块中捕获的。

在您给出的示例中,该方法永远不会抛出IOException,因此声明是错误的(但有效)。我的猜测是,原始方法引发了IOException,但随后它被更新以在中处理异常,但声明没有更改。

如果方法引发了选中的异常,则只需要在方法上包含一个throws子句。如果该方法引发运行时异常,则无需这样做

有关已检查与未检查异常的一些背景信息,请参见此处:


如果该方法捕获异常并在内部处理它(如第二个示例中所示),则无需包含throws子句。

您看到的代码并不理想。你应该:

  • 捕获异常并处理它; 在这种情况下,
    抛出
    不必要的

  • 移除
    try/catch
    ;那么 异常将由 调用方法

  • 可能会捕获异常 执行一些操作,然后重试 异常(不仅仅是消息)


  • 您发布的代码是错误的,如果它正在捕获特定的异常以处理IOException,但却抛出未捕获的异常,则应该抛出异常

    比如:

    public void method() throws Exception{
       try{
               BufferedReader br = new BufferedReader(new FileReader("file.txt"));
       }catch(IOException e){
               System.out.println(e.getMessage());
       }
    }
    


    }这不是答案,而是一条注释,但我无法用格式化代码编写注释,因此这里是注释

    假设有

    public static void main(String[] args) {
      try {
        // do nothing or throw a RuntimeException
        throw new RuntimeException("test");
      } catch (Exception e) {
        System.out.println(e.getMessage());
        throw e;
      }
    }
    
    输出是

    test
    Exception in thread "main" java.lang.RuntimeException: test
        at MyClass.main(MyClass.java:10)
    
    该方法不会声明任何“抛出”异常,而是抛出它们! 技巧在于抛出的异常是不需要在方法上声明的RuntimeException(未选中)。 对于该方法的读者来说,这有点误导,因为她看到的只是一个“throw e;”语句,但没有声明throws异常

    现在,如果我们有

    public static void main(String[] args) throws Exception {
      try {
        throw new Exception("test");
      } catch (Exception e) {
        System.out.println(e.getMessage());
        throw e;
      }
    }
    

    我们必须在方法中声明“throws”异常,否则会出现编译器错误。

    是否应该在方法签名中用“throws”声明未经检查的异常,或者只对检查过的异常使用“抛出”是一种实践吗?这个答案并没有直接解决问题的核心方面:使用
    抛出
    关键字。@hvgotcodes如果我捕获到异常却什么也不做会发生什么?@manoj你会冒着崩溃的风险,因为关键信息是迷路的有些时候(不一定是java),捕获异常而不做任何事情是可以的,但是这些应该被记录下来。例如,在javascript中,您可以尝试调用根据浏览器可能不存在的功能。这不一定是一个需要注意的错误。编译器会做一个非常复杂的静态分析来决定是否需要
    抛出
    public static void main(String[] args) throws Exception {
      try {
        throw new Exception("test");
      } catch (Exception e) {
        System.out.println(e.getMessage());
        throw e;
      }
    }