所以我认为我对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块就可以了。
答案 0 :(得分:78)
如果要捕获异常类型,则不需要抛出它,除非您要重新抛出它。在您发布的示例中,开发人员应该完成一个或另一个,而不是两个。
通常情况下,如果你不打算对异常做任何事情,你就不应该抓住它。
你可以做的最危险的事情是抓住一个例外而不做任何事情。
关于何时适合抛出异常的详细讨论在这里
答案 1 :(得分:20)
如果方法抛出已检查的异常,则只需要在方法上包含throws子句。如果该方法抛出运行时异常,则无需这样做。
有关已检查与未检查的例外情况的一些背景信息,请参阅此处:http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
如果该方法捕获异常并在内部处理它(如第二个示例中所示),则不需要包含throws子句。
答案 2 :(得分:9)
您查看的代码并不理想。你应该:
抓住异常并处理它;
在这种情况下throws
是
unnecesary。
删除try/catch
;在这种情况下
异常将由a处理
调用方法。
可能会抓住异常 执行一些操作,然后重新抛出 例外(不仅仅是消息)
答案 3 :(得分:2)
你是对的,在那个例子中throws
是多余的。它可能是从之前的一些实现中留下的 - 可能是异常最初抛出而不是陷入catch块。
答案 4 :(得分:1)
在您给出的示例中,该方法永远不会抛出IOException,因此声明是错误的(但有效)。我的猜测是原始方法抛出IOException,但随后更新以处理异常,但声明没有改变。
答案 5 :(得分:1)
您发布的代码是错误的,如果捕获特定异常以处理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());
}
}
答案 6 :(得分:1)
这不是答案,而是评论,但我无法使用格式化代码撰写评论,因此这里是评论。
让我们说有
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”异常,否则会出现编译错误。