解释一下java的异常机制 我写了个测试程序,编译未通过,提示如下:unreported exception java.lang.ClassNotFoundException;must be caught or declared to be thrown再在main()后加上throws Exception之后就正常了这样做到底有什么好处? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java 程序在运行过程中若发生了错误(异常现象),系统将产生一个相应的异常类对象来处理,以避免死机、死循环或其它有害的结果发生,保障程序运行的安全性。 我们在 java 程序中不设置如何异常处理语句,它也能检察错误,说明 java 本身具有异常处理机制。当然它的这个异常处理机制不可能是十全十美的,一些不需要设置的异常它也设置了,于是我们有时候不得不抛出这些不需要处理的异常,使得程序正常运行。 上面仅仅上本人的一点见解,仅供参考。 ok 。 下面是我以前学习JAVA异常时的一些总结,你看看对你有没有用一、Java中异常处理的原则*************************************************************************************当一个类在遇到错误时,它应该设法:A.返回到一个安全和已知的状态B.能够使用户执行其它的命令C.如果可能,就保存所有的工作D.如果有必要,可以退出以避免造成进一步的危害*************************************************************************************二、隐含和显式错误的区别*************************************************************************************一个隐含的错误或异常是起源于错误或RuntimeException类。其它类型的异常则被称作是显式异常。隐含异常可以出现在任何类和方法中,在运行时异常的情况下,我们可以有策略地放置if语句来防止它的产生,但在Error的情况下我们将束手无策。显式异常仅仅出现在方法体中,他们在方法体头部已经明确了该方法所可能遇到的异常类型隐含异常在它们产生时被自动抛出,而显式异常必须在那些被明确声明的方法中才可能被抛出*************************************************************************************三、何时使用if-else来预防异常,何时使用try-catch来捕捉异常************************************************************************************* 如果我们明确知道可能发生错误的地方或能够有效预防错误发生,就应该使用if-else来预防错误的发生:比如空指针异常,数组下标越界异常 如果我们无法明确知道错误发生的地方或无法完全避免异常,应该使用try-catch来捕捉异常:比如I/O异常。*************************************************************************************四、如何抛出一个显式异常:*************************************************************************************要抛出一个显式异常,必须用以下语法明确地在方法头部声明该方法将会遇到的异常种类: [modifiers] returnType methodName throws ListOfExceptionType { … throw new ExceptionType1(argument); // 抛出第一种类型的异常…throw new ExceptionTypeN(argument); // 抛出第N种类型的异常}异常一旦抛出,将在调用该方法的上层方法体内寻找合适的异常处理代码,而不会继续执行该方法的正常处理流程。五、如何自定义一个异常*************************************************************************************A.创建一个继承Exception的类或者其它已经存在的异常类的子类B.在该类中创建一个默认的无参构造方法,这个构造方法以适当的错误信息作为输入,来调用它的超类的构造方法C.再增加一个带字符串参数的构造方法,这个构造方法以合适的错误消息作为输入(还包括输入的字符串)来调用它的超类的构造方法例如:public String getText(String s) throws LongStringException{ if(s.length()<=10){ return s;}else { throw new LongStringException(“String too long”);}}*************************************************************************************六、是不是所有的方法都可以抛出一个异常*************************************************************************************不是,如果子类方法覆盖了父类的方法,且父类方法本身不会抛出异常的话,子类的方法即使在方法的头部声明了异常的抛出也不能够抛出异常碰到这种情况,可以采用在一个与父类方法不同名的方法中,调用父类的方法,然后明确地声明该方法可能会抛出的异常就行了。*************************************************************************************七、什么时候才是抛出异常的时机*************************************************************************************A.如果一个简单的测试就可以防止异常的产生,那么就竭力防止它(特别适用RunntimeException)B.如果知道如何正确的处理这种异常,那么就着手解决它,而不要抛出一个异常,因为对于一个需要返回值的方法来说,抛出一个异常会导致该方法的执行中断,转到异常处理方法中,从而不能正常的返回一个值D.如果不能确信怎样去处理这个异常,那就抛出它,把它留给一个合适的方法去处理。同样在调用一个方法时,这个方法抛出一个异常,那么也可以不去处理它,而把它重抛(re-throw)给别的方法去处理*************************************************************************************八、如何捕捉异常*************************************************************************************如果在try块里的任何一段代码产生了一个catch块要捕捉的异常,那么在try块中其余剩下的代码都将被忽略,而相应的catch块将会被执行如果在try块里没有代码产生异常,那么所有的catch语句块都将会被忽略如果抛出的异常在catch块里面没有被声明,那么方法立刻退出*************************************************************************************九、为什么在捕捉异常时要把Exception放在catach块的最后************************************************************************************* 因为当异常产生时,JVM会按照顺序查找与异常匹配的catch块,如果把catch(Exception e)放在所有catch块的最前面,由于大多数RuntimeException类都继承了Exception类,所有的异常都会被catch(Exception e)所捕捉。这意味着其它的catch块都不会被执行。所以catch块的排列顺序应该是按照先子类、后父类的方式排列,最后才是catch(Exception e)*************************************************************************************十、异常的抛出和捕捉的时机*************************************************************************************A. 如果能够找到一个有意义的方法来捕获异常,就立即引入这个方法B. 否则就应该考虑做某些处理后传递或者再次抛出异常,也可以把异常转换为另一种形式,然后抛出一个新的异常C. 另一个方法是,可以完全忽略这个异常,而把它加到方法的头部的throws语句中,由调用这个方法的方法来处理它D. 通过捕获一个公共的异常超类,可以在一个块里面捕获多个异常,但不能够用一个空的catch语句块来完全制止一个异常。************************************************************************************* unreported exception java.lang.ClassNotFoundException;must be caught or declared to be thrown说明你没有捕获这个异常,可能是你其他的地方的代码会产生异常,当你没有抛出,或抛出后没有代码处理就会报错了 java中对于异常的检查很严格,分为checkedException和uncheckedException两种,凡是有可能会抛出异常的地方都要try ....catch或throws给更上级处理,对于uncheckedException异常会有JVM管理,不需要显示try...catch。main throws出异常给虚拟机。 java的异常处理机制算挺完整的了,所以写程序时要时刻留意可能异常发生 java的异常分两种:error和exceptionexception又分为checked exception和unchecked exception有的函数为了使代码易于控制,就在函数声明中指定了可能抛出得checked exception,调用他的函数要捕捉这个exception或者重新抛出 直接在main后抛出是不建议的,最后还是catch一下 Java打开txt文件时显示错误 如何重写鼠标事件函数 来传递一个对象 interface 一直不太理解在此请教.请给详细说明 怎样获取TextArea光标所在的坐标? 新手问 JBuilder 使用方面的问题 请教关于监听端口. 求教:一个继承内隐类的问题。 问题,急,散分!!! ?谁是真正的高手?难道真的无法实现? java.io.StreamCorruptedException: invalid type code: AC我真的无能为力了,能帮帮我吗? 请问关于自动登陆网页 这题为啥是这样?
*************************************************************************************
当一个类在遇到错误时,它应该设法:
A.返回到一个安全和已知的状态
B.能够使用户执行其它的命令
C.如果可能,就保存所有的工作
D.如果有必要,可以退出以避免造成进一步的危害
*************************************************************************************二、隐含和显式错误的区别
*************************************************************************************
一个隐含的错误或异常是起源于错误或RuntimeException类。其它类型的异常则被称作是显式异常。隐含异常可以出现在任何类和方法中,在运行时异常的情况下,我们可以有策略地放置if语句来防止它的产生,但在Error的情况下我们将束手无策。
显式异常仅仅出现在方法体中,他们在方法体头部已经明确了该方法所可能遇到的异常类型
隐含异常在它们产生时被自动抛出,而显式异常必须在那些被明确声明的方法中才可能被抛出
*************************************************************************************三、何时使用if-else来预防异常,何时使用try-catch来捕捉异常
*************************************************************************************
如果我们明确知道可能发生错误的地方或能够有效预防错误发生,就应该使用if-else来预防错误的发生:比如空指针异常,数组下标越界异常
如果我们无法明确知道错误发生的地方或无法完全避免异常,应该使用try-catch来捕捉异常:比如I/O异常。
*************************************************************************************四、如何抛出一个显式异常:
*************************************************************************************
要抛出一个显式异常,必须用以下语法明确地在方法头部声明该方法将会遇到的异常种类:
[modifiers] returnType methodName throws ListOfExceptionType
{ …
throw new ExceptionType1(argument); // 抛出第一种类型的异常
…
throw new ExceptionTypeN(argument); // 抛出第N种类型的异常
}
异常一旦抛出,将在调用该方法的上层方法体内寻找合适的异常处理代码,而不会继续执行该方法的正常处理流程。五、如何自定义一个异常
*************************************************************************************
A.创建一个继承Exception的类或者其它已经存在的异常类的子类
B.在该类中创建一个默认的无参构造方法,这个构造方法以适当的错误信息作为输入,来调用它的超类的构造方法
C.再增加一个带字符串参数的构造方法,这个构造方法以合适的错误消息作为输入(还包括输入的字符串)来调用它的超类的构造方法
例如:
public String getText(String s) throws LongStringException{
if(s.length()<=10){
return s;
}
else {
throw new LongStringException(“String too long”);
}
}
*************************************************************************************
六、是不是所有的方法都可以抛出一个异常
*************************************************************************************
不是,如果子类方法覆盖了父类的方法,且父类方法本身不会抛出异常的话,子类的方法即使在方法的头部声明了异常的抛出也不能够抛出异常
碰到这种情况,可以采用在一个与父类方法不同名的方法中,调用父类的方法,然后明确地声明该方法可能会抛出的异常就行了。
*************************************************************************************
七、什么时候才是抛出异常的时机
*************************************************************************************
A.如果一个简单的测试就可以防止异常的产生,那么就竭力防止它(特别适用RunntimeException)
B.如果知道如何正确的处理这种异常,那么就着手解决它,而不要抛出一个异常,因为对于一个
需要返回值的方法来说,抛出一个异常会导致该方法的执行中断,转到异常处理方法中,从而
不能正常的返回一个值
D.如果不能确信怎样去处理这个异常,那就抛出它,把它留给一个合适的方法去处理。同样在调
用一个方法时,这个方法抛出一个异常,那么也可以不去处理它,而把它重抛(re-throw)给别的方法去处理
*************************************************************************************八、如何捕捉异常
*************************************************************************************
如果在try块里的任何一段代码产生了一个catch块要捕捉的异常,那么在try块中其余剩下的代码都将被忽略,而相应的catch块将会被执行
如果在try块里没有代码产生异常,那么所有的catch语句块都将会被忽略
如果抛出的异常在catch块里面没有被声明,那么方法立刻退出
*************************************************************************************九、为什么在捕捉异常时要把Exception放在catach块的最后
*************************************************************************************
因为当异常产生时,JVM会按照顺序查找与异常匹配的catch块,如果把catch(Exception e)放在所有catch块的最前面,由于大多数RuntimeException类都继承了Exception类,所有的异常都会被catch(Exception e)所捕捉。这意味着其它的catch块都不会被执行。所以catch块的排列顺序应该是按照先子类、后父类的方式排列,最后才是catch(Exception e)
*************************************************************************************十、异常的抛出和捕捉的时机
*************************************************************************************
A. 如果能够找到一个有意义的方法来捕获异常,就立即引入这个方法
B. 否则就应该考虑做某些处理后传递或者再次抛出异常,也可以把异常转换为另一种形式,然后抛出一个新的异常
C. 另一个方法是,可以完全忽略这个异常,而把它加到方法的头部的throws语句中,由调用这个方法的方法来处理它
D. 通过捕获一个公共的异常超类,可以在一个块里面捕获多个异常,但不能够用一个空的catch语句块来完全制止一个异常。
*************************************************************************************
must be caught or declared to be thrown说明你没有捕获这个异常,可能是你其他的地方的代码会产生异常,当你没有抛出,或抛出后没有代码处理就会报错了
exception又分为checked exception和unchecked exception有的函数为了使代码易于控制,就在函数声明中指定了可能抛出
得checked exception,调用他的函数要捕捉这个exception或者
重新抛出