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();