一、异常的继承体系及分类
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.Error
可见,Throwable有两个子类Error和Exception,其中异常又分为运行时异常(非强制异常)和编译时异常(强制异常)。
运行时异常:也就是非强制异常,比如NullPointerException、IndexOutOfBoundsException,都是由于程序员逻辑错误引起的,在程序运行前不会检查,能够编译通过。可以通过改进代码来避免这种异常的发生。
编译时异常:也称强制异常,是指能预见但不能控制的异常,如果程序中存在这种异常,就不能编译通过。通常我们需要使用try…catch..语句或者throws来处理。
而对于运行时错误Error:会编译通过,但是在程序运行时如果出现则会终止运行。对于错误的处理则不用对程序进行处理,应该在程序之外找到逻辑错误的地方。常见错误如:内存不足错误,java.lang.OutOfMemoryError。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。堆栈溢出错误,java.lang.StackOverflowError 。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。
以下是一个栈溢出的例子:
public static void main(String[] args) {
ErrorDemo01 er1 = new ErrorDemo01();
System.out.println(er1.sum(10000));
}
public long sum(long a){
if(a==1){
return 1;
}else{
return sum(a-1);
}
}
运行时就报错:Exception in thread "main" java.lang.StackOverflowError
二、throws与throw的区别
Throw关键字用于方法内部,用来抛出一个异常,如果检查出异常,还应在方法头部声明可能抛出的异常类型。
Throws关键字则适用于方法体外部,声明方法中可能出现的异常。
public static void main(String args[]) throws Exception{
ExceptionDemo01 ed1 = new ExceptionDemo01();
ed1.throwDemo(-5);
System.out.println("可执行后面的程序!");
}
public void throwDemo(int t) throws Exception{
if(t<=0){
throw new Exception("t必须为正数!!");
}
}
运行后显示:
Exception in thread "main" java.lang.Exception: t必须为正数!!
at exceptionDemo.ExceptionDemo01.throwDemo(ExceptionDemo01.java:13) at exceptionDemo.ExceptionDemo01.main(ExceptionDemo01.java:7)
三、用throws还是try… catch...
对于编译时异常到底是用try…catch…还是throws,其实都是可以的。这就相当于BOSS给你一个任务,如果自己能够独立解决就try…catch…,如果解决不了,就需要将问题抛给上一层,直到可以解决这个问题为止,最终没有处理的异常JVM会处理。
在选择的时候可以有以下几点考虑:
1、 将能处理的异常在本方法内就用try…catch…捕获,实在不能解决的异常再throws抛给调用者多层调用的话可能将问题复杂化。
2、 如果希望出现异常的时候还能执行后面的程序则将异常try…catch…,如果希望出现异常时,程序就终止的话,就使用throws抛出异常。
在上面一个例子中如果将t值设为正数,则程序会继续执行,
运行结果显示为:
可执行后面的程序!
最后引用几则异常处理的原则和技巧:
写道
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。
分享到:
相关推荐
java异常总结java异常总结java异常总结java异常总结java异常总结java异常总结
Java异常处理总结
CORBA异常总结.pdf CORBA异常总结.pdf
java常见异常总结,这是在开发过程遇上的异常信息处理方式,相信对大家开发有一定的帮助!!
C#异常处理总结及简单实例 一、异常处理的理解? 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。 因此处理这种错误,就称为异常处理。 二、异常处理如何操作? C# 异常处理时建立在...
这是自己通过看书对java异常处理的一些总结
主要是对 流得 ,异常总结, 仅作为参考资料,希望能有所帮助
SSH异常总结.doc SSH异常总结.doc SSH异常总结.doc
Java常见异常总结,不用在害怕自己没见过的异常了
主要针对c++异常处理过程中的各种机制的总结
Java基础编程异常总结
c++异常处理 总结 ,从c++宝典中摘录
java异常总结.pdf
java异常知识点总结 包含异常的分类 异常的处理 异常的捕捉方法
本文档总结了工作中经常遇到的axis2异常问题该如何解决,本人亲自实践过,可以保证其正确性
总结的常见的JAVA异常。没有涵盖全部异常,但是包括了最常见的饿18中异常