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()
有
必须捕获或宣布未报告异常引发异常
当我删除throws Exception
从这些方法呢?
在Java中,你可能知道,异常可分为两种:一种是需要throws
子句,或者如果你没有指定一个必须处理,另一个是没有。 现在,见下图:
在Java中,你可以扔掉任何扩展Throwable
类。 不过,你不需要指定throws
所有类的条款。 具体地,类,或者是一个Error
或RuntimeException
或任何这些的两个子类。 在你的情况Exception
不是一个子类Error
或RuntimeException
。 所以,这是一个检查异常,并且必须在中指定throws
条款,如果你不处理特定的异常。 这就是为什么你需要throws
子句。
从Java教程 :
一个例外是一个事件,它的程序,扰乱的程序的指令的正常流动的执行期间发生。
现在,如你所知例外分为两种:选中和未选中。 为什么这些分类?
经过例外:它们被用来表示可在程序的执行过程中被回收的问题。 他们通常不是程序员的错。 例如,由用户指定的文件无法读取,或者没有可用的网络连接等,在所有这些情况下,我们的程序并不需要退出,而是可以采取类似的行动提醒用户,或进入备用机制(如离线工作时,网络不可用)等。
unchecked异常:他们又可以分为两种:错误和RuntimeExceptions。 让他们不被选中的原因之一是,他们有许多在数量,以及处理所有这些都会扰乱我们的PROGRAMM并降低其清晰度要求。 另一个原因是:
运行时例外:他们通常是由于程序员的故障发生。 例如,如果一个ArithmeticException
出现被零除的或者ArrayIndexOutOfBoundsException
发生时,那是因为我们不是在我们的编码不够仔细。 他们通常会发生因为在我们的程序逻辑的一些错误。 所以,我们的程序进入生产模式之前,必须将它们清除。 他们在这个意义上取消选中的是,我们的程序必须在其发生时,不能让我们的程序员可以在开发和测试自己的时间解决这个问题。
错误:错误是从通常的程序不能恢复的情况。 例如,如果一个StackOverflowError
发生时,我们的程序不能做很多,比如增加程序的函数调用堆栈的大小。 或者,如果一个OutOfMemoryError
发生时,我们不能做很多工作来增加可用内存量,我们的节目。 在这种情况下,最好是退出程序。 这就是为什么他们是由未经检查。
有关详细信息,请参阅:
Java的需要处理或声明的所有异常。 如果你不使用try / catch块,那么它必须在方法的签名中声明处理异常。
例如:
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
}
}
}
这样,您就可以摆脱在方法声明中“抛出异常”宣言。
Exception
是经过检查的异常类。 因此,调用宣布,它的方法的任何代码throws Exception
必须处理或声明。
在throws Exception
的声明是跟踪的可能抛出的预料之中,但不可避免的理由例外方法的自动化方法。 声明是典型地具体说明可能抛出,如异常的类型或类型throws IOException
或throws IOException, MyException
。
我们每个人都有或将最终编写意外停止和报告异常,由于某些我们没有通过零或指数运行的程序,像师出界此前预期的代码。 由于错误不是由法预计,他们不能被“捕获”,并尝试catch子句处理。 该方法的任何不知情的用户也不会不知道这种可能性和他们的节目也将停止。
当程序员知道某些类型的错误,可能会发生的,但是想处理方法之外,这些例外,该方法可以“抛出”一个或多个类型的异常调用方法,而不是处理它们。 如果程序员没有宣布该方法(可能)抛出异常(或者,如果Java的没有宣布它的能力),编译器可能不知道,这将是长达了解的方法,将来用户,捕捉和处理的方法可能会引发任何异常。 因为程序可以有许多不同的程序编写方法很多层,就很难(不可能)跟踪哪些方法可能抛出异常。
尽管Java有申报异常的能力,你仍然可以写与未处理的和未申报异常的新方法,而Java将编译它,你可以运行它,并希望最好的结果。 什么Java将不会让你做的就是编译你的新方法,如果它使用的是已被宣布为引发异常(S)的方法,除非你要么处理异常声明(一个或多个)在你的方法或声明的方法抛出相同例外(S),或者如果有多个例外,你可以处理一些扔休息。
当程序员声明该方法抛出特定类型的异常,它是使用一个例外是可能的方法警告其他程序员的只是一个自动化的方式。 然后程序员可以决定处理的异常或通过声明调用方法也抛出同样的异常的警告通过。 由于编译器已经警告例外是可能在这种新方法,它可以自动检查新方法的调用者未来处理异常或声明,并执行一个或另一个发生。
关于这种类型的解决方案的好处是,当编译器会报告Error: Unhandled exception type java.io.IOException
它给被声明抛出异常的方法的文件和行号。 然后,您可以选择简单地推卸责任,并宣布你的方法还“抛出IOException异常”。 这是可以做到全由主法的方式,其中,将进而导致程序停止并报告异常给用户。 然而,这是更好地捕获异常,并在一个不错的方式处理它,例如向用户解释发生了什么,以及如何解决它。 当一个方法不捕获并处理异常,它不再申报除外。 降压停在那里可以这么说。
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方法在你的程序),但你必须在第一个来电的方法里面的“主”。 在一个字,还有“扔”,必须有“捕获/试”,即使不是同一个方法,其中发生异常。
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
因为被检查在显示异常()方法,该方法没有在该方法中被处理,所以我们使用抛出关键字用于传播异常。
void show2() throws Exception //Why throws is necessary here ?
{
show();
}
由于您使用的是show2()方法的show()方法,并已传播异常ATLEAST你应该处理在这里。 如果你在这里没有处理异常,那么你正在使用抛出关键字。 所以这是在方法签名使用的理由抛出关键字。