首页 文章

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

提问于
浏览
80

所以我认为我对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());
          }
     }

你有什么理由想在这个例子中使用 throws 吗?看来如果你只是在做IOException之类的基本异常处理,你只需要try / catch块就可以了 .

7 回答

  • 77

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

    通常情况下,如果您不打算对例外做任何事情,则不应该 grab 它 .

    你可以做的最危险的事情就是捕捉异常并且不做任何事情 .

    这里有关于何时适合抛出异常的良好讨论

    When to throw an exception?

  • 1

    如果方法抛出已检查的异常,则只需要在方法上包含throws子句 . 如果该方法抛出运行时异常,则无需执行此操作 .

    有关已检查与未检查的异常的一些背景信息,请参阅此处:http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

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

  • 1

    您查看的代码并不理想 . 你应该:

    • grab 异常并处理它;在这种情况下 throws 是不必要的 .

    • 删除 try/catch ;在这种情况下,Exception将由调用方法处理 .

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

  • 1

    你是对的,在那个例子中 throws 是多余的 . 它可能是从之前的一些实现中留下的 - 也许最初抛出异常而不是捕获块中的异常 .

  • 20

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

  • 9

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

    就像是:

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

    要么

    public void method(){
       try{
               BufferedReader br = new BufferedReader(new FileReader("file.txt"));
       }catch(IOException e){
               System.out.println("Catching IOException");
               System.out.println(e.getMessage());
       }catch(Exception e){
               System.out.println("Catching any other Exceptions like NullPontException, FileNotFoundExceptioon, etc.");
               System.out.println(e.getMessage());
       }
    

    }

  • 2

    这不是答案,而是评论,但我不能用格式化代码写评论,所以这里是评论 .

    让我们说有

    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)
    

    该方法不会声明任何“抛出”异常,但抛出它们!诀窍是抛出的异常是RuntimeExceptions(未经检查),不需要在方法上声明 . 对于该方法的读者来说,这有点误导,因为她所看到的只是一个“扔掉”;声明但没有声明抛出异常

    现在,如果有的话

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

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

相关问题