因此,我认为我对Java中的异常处理有很好的基本了解,但是最近我正在阅读一些使我感到困惑和怀疑的代码。我想在这里解决我的主要疑问是,当一个人应该在Java方法声明中使用以下几点:

    public void method() throws SomeException
    {
         // method body here
    }

从阅读一些类似的帖子,我收集到 被用作一种声明 某些感觉 可以在执行方法期间抛出。

我的混乱来自一些看起来像这样的代码:

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

有什么原因您想使用 在这个示例中?看来,如果您只是对诸如IOException之类的基本异常处理,那么您只需要尝试/捕获块就可以了。

有帮助吗?

解决方案

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

通常,如果您不打算做任何例外,则不应抓住它。

您可以做的最危险的事情是抓住例外,不要对此做任何事情。

很好地讨论何时适当地抛出例外情况

什么时候抛出例外?

其他提示

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

有关检查与未选中的例外的一些背景,请参见此处: http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

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

您查看的代码不是理想的。您应该:

  1. 捕获例外并处理它;在这种情况下 throws 是不必要的。

  2. 去除 try/catch;在这种情况下,例外将通过呼叫方法来处理。

  3. 捕获例外,可能会执行一些动作,然后重新恢复异常(不仅仅是消息)

你是正确的,在那个示例中 throws 是多余的。它可能从以前的某些实现中留在那里 - 也许最初是抛出的例外,而不是陷入困境。

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

您发布的代码是错误的,如果要捕获特定的异常以处理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());
   }

}

这不是答案,而是评论,但我无法用格式的代码写评论,因此这是评论。

假设有

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(未检查),不需要在该方法上声明。对于该方法的读者来说,这有点具有误导性,因为她所看到的只是“投掷e”;声明,但没有声明抛出异常

现在,如果我们有

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top