error和exception类用于处理java中的错误
他们继承自throwable类 throwable类又继承自object类;这些类或者
继承自他们的类的实例,都可以被jvm(不懂?链接:
http://baike.baidu.com/view/160708.htm)识别为异常。
注意:error类异常为内部错误,正常情况下不期望用户的程序捕获他
们,java中管理处理的关键字:try,catch,throw,throws,finally.必
须监控异常的程序语句包含在try块中,通过catch,可以捕获异常并用
合理方式来处理,也可以直接用throw直接抛出异常,throws子句用于
在方法声明中抛出异常,在finally块中,可以指定在程序结束之前必
须执行的代码,也就是无论是否发生异常,finally快中的代码都将被
会执行。 try块和catch块 将要被监控的代码(可能产生异常的代码)防止在try块中,catch字句
应直接位于try后,catch字句可以包含语句,处理异常及打印生成异常
的原因,每个catch的作用域仅限与try块!一个try块可以有多条catch
语句!.一旦异常处理完毕,程序可以继续执行!不发生错误catch将永
不会执行//够详细?
try{
int num = calculate(9,0); //用户自定义方法
System.out.pritln(num);
catch (Exception exception)
System.err.println("发生异常:"+exception.toString());
exception.prrintStackTrace();
}
..........
int calculate (int a , int b)
int num = a/b;
return num;
exception是Exception类的实力,注意在catch块中,方法toString()
和printStackTrace()用于输出发生的异常。
异常类的方法:
printStackTrace()是在Exception类中定义的方式,用于显示有关异常
的信息,他包含的信息不仅涉及异常的原因,还涉及产生该异常的代码
行
getMessage()是在RuntimeException类中定义的方法,用于获得与异常
相关的详细信息
getStackTrace()方法提供通过程序对printStackTrace()输出的堆栈跟
踪信息的访问。他返回一个堆栈元素的数组,每个元素表示一个堆栈帧
!
如果原因不存在或者未知,getCause()方法将返回错误或null的原因。
实例:
class ExceptionRaised{
protected ExceptionRaised(){
static int calculate (int operand1,int aperand2){
//return 返回余数
int result =operand1 / operand2;
return result;
}
public class ArithmeticException{
protected ArithmeticException(){
} // 构造方法
@parem args 字符串参数的数组
public static void main (string[] args){
ExceptionRaise obj = new ExceptionRaised();
try{
int result =obj.calculate(9,0);
system.out.pringtln(result);
}
catch (Exception e){
System.err.printl("发生异常:" + e.toString());
e.printStackTrace();
//////////////////////////////////////////////////////////////
代码解释:
声明一个Exception 类型的实例e,确保使用对象e可以捕获到任何类型
的异常,因此,当引发的异常类型在设计时未知时,可使用一般类
Exception来捕获错误
catch()快可以捕获在calculate()方法执行过程中发生的任务错误,因
此输出语句将永远得不到执行,因为当被除数为0时,发生异常,就会
直接执行catch块中的代码。
有点累,先去吃晚饭(孤独的游鱼 2008-11-16 19:46)
酒足饭饱了,继续:
finally块
finally块可以确保发生异常时执行任何操作,包括所有的清理工作,
无论是否发生异常,此模块都将自行,如果引发异常,及时没有catch
块与引发的异常匹配,也将执行,finally子句是可选的,但每个try语
句至少应该有一个catch或finally字句
实例:
try
methodGeneratingException();
}
catch(Exception e)
..........}
finally{
cleanup();
................
如果methodGeneratingException();方法异常,将调用cleanup()方法
,即使异常未知,finally块中的cleanup()方法也会执行,finally块
应放置在最后一个catch块后。 多重catch块 如果一段代码科恩能够会导致多个错误,可以就是可以产生多个异常,
可以使用catch子句,分别捕获每个错误,按照出现的顺序来查看每个
catch语句,并执行第一个与异常匹配的语句,执行其中一条catch语句
之后,其他的catch语句将被忽略,然后控制流程转到try/catch块后面
的语句
-------------------------------------------------------------
//////////////////////////////////////////////////////////////
.....
try{
doFileProcessing(); //用户自定义方法
displayResults(); //用户自定义方法
} catch (ArithmeticException e){
handleArithmeticException (e); //用户自定义处理程序
catch (Exception e){
System.err.println("错误:"+ e.printStackTrace());
}
............//////////////////////////////////////////////////
///////////
代码解释:
第一个catch块捕获ArithmeticException,如果发生异常,则由这个块
单独处理,然而如果不是ArithmeticException类型,控制权则转到其
他异常的第二个catch块
ArithmeticException将由第一个catch捕获和处理,而任何其他类型的
异常将由第二个catch块处理
ArithmeticException是RuntimeException类的子类,而
RuntimeException又是Exception的子类,ArithmeticException将在
catch块中的Exception之前处理,原因是:如果先处理Exception的实
力,控制权将永远不会转到第二个catch块,也就是说,使用多重catch
语句时一定要记住:异常子类应该位于任何父类之前,这是因为使用父
类的catch语句将捕获该类型的异常以及它的任何子类的异常,因此,
如果子类位于它的父类之后,控制权就永远不会传给它,在java中,不
能到达的代码是一个错误。
----------------------
catch (Exception e){
System.out.println("父类异常 catch语句");
catch (ArithmeticException ae){//错误-不能到达代码
System.out.printn("这个子类的父类是:"+"exeception类
且不能到达"); } catch语句就像只有一个参数且没有返回类型的方法定义,参数可以是
类,也可以是接口,发生异常时,将搜索嵌套try/catch语句时候有与
异常类匹配的参数,如果参数符合下列条件,可以认为它与异常匹配:
--是异常的父类
关于常用异常类的父子关系在图中表示:
见图:
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
关于嵌套try-catch块我就不写了
//我心中的lover上线了 跟她聊天了。。。
关于后面throw和throws明天再搞!
总结:
JAVA必须显式处理会抛出异常的方法调用,要么try ... catch,要么
throws。
也就是要么你在方法里面处理,要么往上抛。 你不得不选择一种。为
什么要try?它就是一种文法,通常情况下try里面的方法调用会有可能
抛出可预料的应用级异常,这让人很无奈,只要有方法throws 某个异
常,你必须去截获或者往上抛(C#就简单些,默认往上抛),否则编译出
错。
当然,方法很有可能会抛出难以预料的系统级异常,但是那通常并不需
要我们去截获处理,当然你也可以去截获并且处理,如果你能预料得到
。
换种说法: try里面就是你预料将要发生的应用级异常的方法,并且
知道需要catch到某个异常后作出什么处理,否则就往上扔。可能有些
方法调用你不知道会可能抛出什么异常,写那些方法的人会告诉你的,
也就是方法的throws申明(如果你不try,那么编译器会提示你去try,
否则编译通不过)

