Java 除了传播已检查的异常之外,是否还有其他抛出角色?

Java 除了传播已检查的异常之外,是否还有其他抛出角色?,java,exception-handling,propagation,throws,checked-exceptions,Java,Exception Handling,Propagation,Throws,Checked Exceptions,在对异常处理中的抛出语句进行了越来越多的研究之后,我感到困惑。我发现- 如果一个方法能够导致一个它没有引起的异常 句柄时,它必须指定此行为,以便该方法的调用方 我们可以防范这种例外情况 除了使用抛出,还有一个异常-我的控制台显示以下错误- Exception in thread "main" java.io.IOException at A.meth1(Boxing1.java:17) at B.meth2(Boxing1.java:24) at Boxing1.main

在对
异常处理中的
抛出
语句进行了越来越多的研究之后,我感到困惑。我发现-

如果一个方法能够导致一个它没有引起的异常 句柄时,它必须指定此行为,以便该方法的调用方 我们可以防范这种例外情况

除了使用抛出,还有一个异常-我的控制台显示以下错误-

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)
在我没有将meth1调用放入try-catch块之前,尽管使用了throws,但仍然存在异常。投掷在这里的作用是什么

try{new A().meth1();}catch(Exception e){System.out.println(e);}
我需要你的确认。我很困惑。我的单行查询是-


抛出
是否还有其他角色代替传播
检查异常

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

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

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");
        }
    }
}
公共类多功能管理器{
私有列表内容;
.
. 
.
public void addFileContent(字符串文件名){
文件=新文件(文件名);
试一试{
FileReader fr=新的FileReader(文件);
.
//将文件内容添加到文件内容列表
.
}捕获(IOE异常){
System.err.println(“未添加文件”);
}
}
}
在本例中,您显然希望在MultipleFileManager级别处理异常,因为如果一个损坏的文件会使整个线程崩溃,这将是非常错误的

因此,FileReader类方法中的抛出IOException语句告诉您,您将在addFileContent()级别处理异常,或者如果遇到损坏的文件,您将冒着使引发异常的整个线程崩溃的风险


如果该线程恰好是主线程,整个应用程序将崩溃。

正如您所说,有两种异常

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

  • “未检查的异常”不需要特别注意。这些异常类似于
    NullPointerException
    ,bug您不想编写代码来掩盖潜在的bug。不可能包罗万象。然而,如果您想捕获未检查的异常,您可以

  • 注意:还有一些其他可丢弃的对象。您可以抛出扩展
    Throwable
    类的所有对象。但您不应该在代码中使用此功能。这实际上是针对系统错误和断言的

如果抛出选中的异常,则需要通过在方法签名中指定
抛出某些异常来警告开发人员。对于未检查的异常,您不需要

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

最后,在本例中,将异常一直传播到顶部,传播到
main()
方法。甚至在那里你还在继续传播它。在这种情况下,JVM将只打印它。

让我们诊断:

首先,由于代码的原因,您的程序将抛出一个异常

throw new IOException();
当您放置try-catch块时,异常将在catch块中处理

请记住,有两种类型的异常:已检查和未检查的异常,然后是错误

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

在一般实践中:

  • catch块将处理异常
  • Throws会将错误传递给调用方,但没有恢复机制

您还可以添加
抛出一些RuntimeException
。它对于编译器来说是多余的,但是作为一个文档是有用的。为什么你认为它可以做其他的事情呢?你读过这方面的东西吗?或者用不同的方式问。。。你为什么困惑?您是否在关于
抛出的描述中发现了矛盾?您上面的陈述几乎是正确的-“这是为了告诉调用类有可能发生此异常,我现在不处理它。您会注意的。”@dubey theHarcortians关于此问题的困惑在哪里?这与您在问题中所写的相同,因此我仍然不知道您的问题是什么。“除了使用throws,还有一个异常”方法
main
应该将其异常传播到哪个方法?“上面”没有任何东西可以处理该异常,因此它仍然未处理。“或者你冒着整个应用程序崩溃的风险”。。。你的意思是“或者你冒着破坏当前线程的风险”。如果当前线程是“主”线程,那么它将使应用程序崩溃,但如果不是,那么只有该线程死亡。感谢您发现错误和澄清,我将编辑答案我只寻找是或否作为答案。只描述是否存在任何其他角色的抛出,而不是Prapoging检查异常。没有其他角色。它只是传播异常。但您不能仅将其用于已检查的异常,也不能用于未检查的异常(但这不是强制性的),也不能用于错误(这是一个单独的
可丢弃的类)。错误通常发生在操作系统中
throw new IOException();