3

在研究了越来越多关于throws声明的内容后,Exception Handling我感到困惑。我发现-

如果方法能够导致它无法处理的异常,则它必须指定此行为,以便方法的调用者可以保护自己免受该异常的影响。

class Boxing1{  
public static void main(String args[]) throws IOException{
    new B().meth2();
    System.out.println("33333333");
}
}
class A{

    void meth1() throws IOException{
        throw new IOException();
        //throw new NullPointerException();
        //System.out.println("111111111111");
    }
}
class B{
    void meth2() throws IOException{
        new A().meth1();
        System.out.println("2222222");
    }
}

而不是使用 throws 仍然存在异常-我的控制台显示以下错误-

Exception in thread "main" java.io.IOException
    at A.meth1(Boxing1.java:17)
    at B.meth2(Boxing1.java:24)
    at Boxing1.main(Boxing1.java:10)

直到我没有在 try-catch 块中调用 meth1,尽管使用了 throws,但仍然存在异常。throws在这里的作用是什么?

try{new A().meth1();}catch(Exception e){System.out.println(e);}

我需要你的确认。我很困惑。我的单行查询是-

throws除了传播 a之外,还有其他角色CheckedException吗?

4

3 回答 3

3

我认为异常处理是非常合乎逻辑的,并且 throws 是必要的,因为您并不总是希望在可能发生的级别上处理异常。

假设您有一个管理多个文件中存在的值的对象

public class MultipleFileManager {
    private List<String> filesContent;
    .
    . 
    .
    public void addFileContent(String filename) {
        File file = new File(filename);
        try {
            FileReader fr = new FileReader(file);
            .
            //adding filecontent to filesContent list
            .
        } catch (IOException e) {
            System.err.println("file not added");
        }
    }
}

在此示例中,您显然希望在MultipleFileManager级别处理异常,因为如果只有一个损坏的文件可能会使整个线程崩溃,那将是非常错误的。

因此, FileReader类方法中的throws IOException语句告诉您,您将在addFileContent()级别处理异常,或者如果遇到损坏的文件,则可能会导致引发异常的整个线程崩溃。

如果碰巧这个线程是一个主线程,整个应用程序就会崩溃。

于 2015-05-05T10:14:29.390 回答
2

正如你所说,有两种例外。

  • “已检查的异常”需要开发人员注意。当您使用抛出已检查异常(即IOException)的方法时,您需要处理它(即捕获它)或将其传播给调用者(即抛出它),假设调用者将捕获它。

  • “未经检查的异常”不需要特别注意。这些是例外,例如NullPointerException,错误。您不想编写代码来覆盖潜在的错误。不可能涵盖所有内容。不过,如果您想捕获未经检查的异常,您可以。

  • 注意:还有一些其他的可抛物。您可以抛出所有扩展Throwable类的对象。但是你不应该在你的代码中使用这个功能。这确实适用于系统错误和断言。

如果您抛出一个检查异常,那么您需要throws SomeException通过在您的方法签名中指定来警告开发人员。对于未经检查的异常,您不需要。

编译器对此进行检查。它很容易识别未经检查的异常,因为未经检查的异常扩展了RuntimeException类。

最后,在您的情况下,您将异常一直传播到 top,到您的main()方法。即使在那里你继续传播它。在这种情况下,JVM 只会打印它。

于 2015-05-05T10:33:00.853 回答
2

让我们诊断:

首先你的程序会因为代码抛出异常

throw new IOException();

当你放置一个 try catch 块时,异常将在 catch 块中处理。

请记住,有两种类型的异常:Checked 和 Unchecked Exceptions,然后是Errors

throw关键字只是引发异常(它也可以是自定义异常!!!)并停止执行(如果没有使用 catch 处理异常)

在一般实践中:

  • catch 块将处理异常
  • Throws 会将错误传递给他的调用者,而没有恢复机制。
于 2015-05-05T10:50:58.103 回答