异常的学习
异常在java.lang.Throwable 类中,其中Throwable类是Java语言中所有错误或异常的超类。
- Throwable类下有两个子类:分别是Error和Exception
- Error是已知所有错误的父类。
- Exception是所有异常的父类。
- Exception子类RuntimeException是运行时异常。
- Error和Exception区别:
- Exception将异常处理掉,可以继续执行。
- Error必须修改程序,无法继续执行。
异常的处理方式:
格式:
try{
被检测的代码
可能出现的异常
}catch(异常类名 变量){
异常的处理方式(可以是循环 判断 调用方法 变量)
}finally{
必须要执行的代码
}
注意:
- 多个catch处理时catch后面的括号中写的是异常类的类名而且需要有顺序
1.1 平级异常:抛出的异常之间没有继承关系,不需要按顺序。
1.2 上下级关系的异常:越高级的异常,写在下面。
例如:
catch(Exception ex){
System.out.println(ex);
}catch(RuntimeException rtex){
System.out.println(rtex);
}
这个是错误的,因为所有的异常Exception都可以检测出来,后面的RuntimeException留着就没有意义了,因此编译是不会通过的。只需要改为这样的就可以了。
catch(RuntimeException rtex){
System.out.println(rtex);
}catch(Exception ex){
System.out.println(ex);
}
这样做的目的就是如果能判断出来该语句会发生什么可能的异常就直接· 用对应的异常处理。能更加精确的判断该异常。
- Finally无论程序是否有异常出现,程序必须要执行。目的:用来释放资源。
2.1 异常的分类:
异常分为编译异常和运行异常。
2.2 编译异常:
调用了抛出异常的方法,不处理编译失败。需要用到try…catch和抛出异常。
2.3 运行异常:
抛出的异常是RuntimeException类,或者是他的子类。 - 运行异常的特点:
方法内部抛出的异常属于运行异常,如new XXXException,在方法的声明上不需要thorws语句,调用者不需要处理即不用(try…catch)语句。
对于违反了真实情况的异常用运行异常来抛出,因为后面的计算都没有意义,而运行异常不能发生,如果发生必须要程序员来停止程序运行,修改源代码。
例如求圆面积的的算法:
class Circle{
public int r;
public double area(int r)
{
return r*r*Math.PI;
}
}
public class text {
public static void main(String[] args) {
Circle cir=new Circle();
System.out.println(cir.area(-1));
}
}
这种情况便出现了运行异常,即半径r不能<=0,该方法r=-1,运行成功了,违背了真实情况。于是就需要用到运行异常对方法进行停止并提醒程序员程序有问题。
class Circle{
public double area(int r){
if(r<=0)
{
throw new RuntimeException("圆不存在");
}
return r*r*Math.PI;
}
}
public class text {
public static void main(String[] args) {
Circle cir=new Circle();
System.out.println(cir.area(-1));
}
}
这样运行的代码,判断出半径r<=0,就不再计算了,因为后面的计算也没有意义。
继承中,子类重写父类方法时的异常处理的结论:
- 父类的方法,如果抛出异常,子类重写后可以抛出异常,也可以 不 抛出异常,但是,如果子类抛出异常,抛出的异常不能大于父 类的 异常。
- 父类的方法,没有异常抛出,子类重写后也不能抛出异常,如果 子 类中调用了抛出异常的方法,只能用try…catch对子类调用的异 常处 理。