什么时候在Java方法声明中使用throw?

wz8daaqr  于 2023-02-02  发布在  Java
关注(0)|答案(7)|浏览(146)

所以我认为我对Java中的异常处理有了很好的基本理解,但是最近我阅读一些代码,这些代码给了我一些困惑和疑虑。我想在这里解决的主要疑虑是,在Java方法声明中,何时应该使用throw,如下所示:

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块,仅此而已。

bcs8qyzn

bcs8qyzn1#

如果你正在捕捉一个异常类型,你不需要抛出它,除非你打算重新抛出它。在你发布的例子中,开发人员应该做一个或另一个,而不是两个都做。
通常,如果您不打算对异常执行任何操作,则不应捕获它。
你能做的最危险的事情就是捕获一个异常而不对它做任何事情。
此处详细讨论了何时适合引发异常
When to throw an exception?

56lgkhnf

56lgkhnf2#

你只需要在一个方法抛出一个检查异常的时候在这个方法上包含一个throws子句。如果这个方法抛出一个运行时异常,那么就没有必要这样做。
有关已选中与未选中异常的一些背景信息,请参见此处:http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
如果方法捕获异常并在内部处理它(如第二个示例),则不需要包含throws子句。

5w9g7ksd

5w9g7ksd3#

您查看的代码不理想。您应该:
1.捕获异常并处理它;在这种情况下,X1 MON 1X是不必要的。
1.拆下try/catch;在这种情况下,异常将由调用方法处理。
1.捕获异常,可能执行某些操作,然后重新引发异常(不仅仅是消息)

1yjd4xko

1yjd4xko4#

你是对的,在这个例子中throws是多余的,可能是之前的实现留下的--可能是最初抛出的异常,而不是在catch块中捕获的。

nue99wik

nue99wik5#

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

ctrmrzij6#

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

mbzjlibv

mbzjlibv7#

这不是一个答案,而是一个注解,但我无法用格式化代码编写注解,所以下面是注解。
假设有

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)

该方法没有声明任何"throws"异常,而是抛出了它们!诀窍在于抛出的异常是RuntimeExceptions(未选中),不需要在方法上声明。这对方法的读者来说有点误导,因为她看到的只是一个"throw e;"语句,但没有声明引发异常
现在,如果我们有

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

我们必须在方法中声明"throws"异常,否则我们会得到一个编译器错误。

相关问题