class throwseg1
{
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
void show2() throws Exception // Why throws is necessary here ?
{
show();
}
void show3() throws Exception // Why throws is necessary here ?
{
show2();
}
public static void main(String s[]) throws Exception // Why throws is necessary here ?
{
throwseg1 o1 = new throwseg1();
o1.show3();
}
}
为什么编译器报告方法show2(),show3()和main()
unreported exception Exception that must be caught or declared to be thrown
当我从这些方法中删除throws Exception时?
@PaulTomblin主要肯定可以声明抛出异常。 如果是这样,JVM将关闭。 这就像编译器允许的那样忽略它。
当被调用的方法(Methdod1)抛出Exception时,我们必须用throws Exception定义调用方法(Method2); 如果我们没有在调用方法中处理该异常。 这样做的目的是让方法2的调用方法(Method3)能够解决方法2抛出异常并且你应该在这里处理它,否则它可能会中断你的程序。
类似地,如果Method3没有在它的主体中处理异常,那么它必须在其方法定义中定义throws Exception以提供其调用方法。 扩展上一条评论
在Java中,您可能知道,异常可以分为两类:一个需要throws子句,或者如果不指定一个而必须处理,另一个不需要。现在,请看下图:
在Java中,您可以抛出任何扩展Throwable类的东西。但是,您不需要为所有类指定throws子句。具体来说,是Error或RuntimeException的类或这两个类的任何子类。在您的情况下,Exception不是Error或RuntimeException的子类。因此,它是一个已检查的异常,如果您不处理该特定异常,则必须在throws子句中指定。这就是你需要throws子句的原因。
从Java教程:
An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions.
现在,如您所知,异常分为两类:已选中和未选中。为什么这些分类?
Checked Exception:它们用于表示在程序执行期间可以恢复的问题。他们通常不是程序员的错。例如,用户指定的文件不可读,或者没有可用的网络连接等。在所有这些情况下,我们的程序不需要退出,而是可以采取警告用户或进入后备的操作机制(如网络不可用时离线工作)等
未经检查的异常:它们可以再次分为两个:错误和RuntimeExceptions。它们不受限制的一个原因是它们数量众多,要求处理所有这些都会使我们的程序混乱并降低其清晰度。另一个原因是:
运行时异常:它们通常由于程序员的错误而发生。例如,如果发生除零的ArithmeticException或发生ArrayIndexOutOfBoundsException,那是因为我们在编码时不够谨慎。它们通常是因为我们的程序逻辑中存在一些错误。因此,必须在我们的程序进入生产模式之前清除它们。它们是未经检查的,因为我们的程序在发生时必须失败,以便我们的程序员可以在开发和测试时自行解决它。
错误:错误是通常程序无法恢复的情况。例如,如果发生StackOverflowError,我们的程序就不能做太多,比如增加程序函数调用堆栈的大小。或者如果发生OutOfMemoryError,我们无法增加程序可用的RAM量。在这种情况下,最好退出程序。这就是他们不受限制的原因。
详细信息请参阅:
未经检查的例外 - 争议
捕获或指定要求
我从你的答案得到的是Error类及其子类和RuntimeException类及其子类,它们来自未经检查的异常(如System.out.println(5/0);没有必要抛出,因为它是一个运行时异常,但我们仍然可以应用try catch)并检查Exception类,因此我们需要在该方法中声明throws子句以及调用它的每个方法
@ rd4code或者我们必须用try ... catch来处理它们。
还有一个问题:如果将异常分类为未选中和已检查,特别是未经检查的异常(运行时错误),以避免在编译期间出现更多错误?
@ rd4code查看更新的答案
@Jomoos - 假设方法内的代码抛出IOException。那么,可以在方法的声明中加入"抛出异常"吗?
哦。我现在明白了。异常层次结构的规则有一个例外。让。完善。感。谢谢Java。
Java要求您处理或声明所有异常。如果您没有使用try / catch块处理Exception,则必须在方法的签名中声明它。
例如:
class throwseg1 {
void show() throws Exception {
throw new Exception();
}
}
应该写成:
class throwseg1 {
void show() {
try {
throw new Exception();
} catch(Exception e) {
// code to handle the exception
}
}
}
这样你就可以摆脱方法声明中的"throws Exception"声明。
所有不是RuntimeException子类的异常,即。
如果有任何其他类如Exception被检查?
你什么意思?由于所有异常对象都将"Exception"作为其基类,因此如果捕获"异常"对象(如我的示例中),它将捕获引发的任何异常。更具体(因为不同的异常可能需要不同的处理方式),你应该有多个catch块。
如果我要说检查的异常需要在@编译时处理并在运行时捕获。我对吗 ?如果是,那么对未经检查的例外的同一句话进行短语会是什么?
throws Exception声明是一种自动跟踪可能因预期但不可避免的原因而抛出异常的方法的方法。声明通常特定于可能抛出的异常的类型或类型,例如throws IOException或throws IOException, MyException。
我们都已经或者最终会编写意外停止的代码并报告由于我们在运行程序之前没有预料到的异常,例如除零或索引越界。由于该方法不期望错误,因此无法使用try catch子句"捕获"它们。任何毫无防备的方法用户也不会知道这种可能性,他们的程序也会停止。
当程序员知道可能发生某些类型的错误但希望在方法之外处理这些异常时,该方法可以将一种或多种类型的异常"抛出"到调用方法而不是处理它们。如果程序员没有声明方法(可能)抛出异常(或者如果Java没有能力声明它),编译器就无法知道,并且将由该方法的未来用户知道,捕获并处理方法可能抛出的任何异常。由于程序可以有许多不同程序编写的多层方法,因此很难(不可能)跟踪哪些方法可能会抛出异常。
尽管Java具有声明异常的能力,但您仍然可以使用未处理和未声明的异常编写新方法,Java将对其进行编译,您可以运行它并希望获得最佳效果。 Java不允许你做的是编译你的新方法,如果它使用一个被声明为抛出异常的方法,除非你在方法中处理声明的异常或声明你的方法抛出它例外或如果有多个例外,你可以处理一些并抛出其余部分。
当程序员声明该方法抛出特定类型的异常时,它只是一种警告其他程序员使用该方法的自动方式,即异常是可能的。然后程序员可以决定处理异常或通过声明调用方法也引发相同的异常来传递警告。由于编译器已在此新方法中被警告异常,因此它可以自动检查新方法的未来调用者是否处理异常或声明异常并强制执行其中一个或另一个。
关于这种解决方案的好处是,当编译器报告Error: Unhandled exception type java.io.IOException时,它会给出声明抛出异常的方法的文件和行号。然后,您可以选择简单地传递降压并声明您的方法也"抛出IOException"。这可以一直到主方法,然后它将导致程序停止并向用户报告异常。但是,最好捕获异常并以一种很好的方式处理它,例如向用户解释发生了什么以及如何解决它。当方法捕获并处理异常时,它不再需要声明异常。可以说,降压停在那里。
Exception是已检查的异常类。因此,任何调用声明throws Exception必须处理或声明它的方法的代码。
声明链中的每个方法都抛出异常,包括main。那么问题出在哪里?
@PaulTomblin我问为什么有必要在调用函数中写抛出异常,调用抛出异常的函数
好的,我不明白你为什么要问你从你发布的代码中实际上没有得到的编译器错误。这是一种奇怪的询问方式。
如果通过在当前方法的签名中声明throws指令来传播异常,那么在行或调用堆栈的某处,必须使用try / catch构造来处理异常。
此评论应添加到评论部分,因为它不提供可验证的答案或一个示例。 - stackoverflow.com/help/how-to-answer
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
由于在show()方法中检查了异常,该方法没有在该方法中处理,因此我们使用throws关键字来传播Exception。
void show2() throws Exception //Why throws is necessary here ?
{
show();
}
由于您在show2()方法中使用了show()方法,并且至少传播了异常,因此您应该在此处理。如果您没有在此处理异常,那么您正在使用throws关键字。
这就是在方法签名中使用throws关键字的原因。
package javaexception;
public class JavaException {
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
void show2() throws Exception // Why throws is necessary here ?
{
show();
}
void show3() throws Exception // Why throws is necessary here ?
{
show2();
}
public static void main(String[] args) {
JavaException a = new JavaException();
try{
a.show3();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
只是程序中的小变化。许多关于主要问题似乎被误解的是,每当你抛出异常时你需要处理它,在同一个地方没有必要(例如程序中的show1,2,3方法),但你必须首先调用方法在'主'里面。总之,有'throw',必须有'catch / try',即使异常发生的方法不同。
基本上,如果你没有在抛出它的同一个地方处理异常,那么你可以在函数的定义中使用"throws exception"。