对于程序来说,不能存在潜在的危险即bug,所以要进行Debug,让软件错误必须得到健壮的处理,既具有较强的鲁棒性(鲁棒性:点击查看鲁棒性)
Java异常处理主要有以下优点:
1.通过面对对象的方法进行异常处理,不同的异常处理进行分类,体现其良好的层次性并增加了程序的可读性。
2.异常处理使得处理异常的代码和“常规”代码分开,减少代码行数。
3.由于异常事件当成对象进行处理,可以把多个具有相同父类的异常进行统一处理,使用灵活。
4.其异常处理机制为具有动态运行特性的复杂程序提供强有力的控制方式。
5.Java异常事件沿调用栈自动向上传递,不行C/C++通过返回值传递,简化代码。
在Java类库中每个类包中定义了异常类,都可以间接或者直接从Throwable类继承,Throwable类由两大部分组成:java.lang.Error和java.lang.Exception,其层次图如下:
(图片来源:Java学习指南第四版上册)
那么,什么样的才可以称为异常?其实当你的程序存在异常时,系统会给你显示出来:
这里举个简单的例子:
我们可以看到系统显示的是EXception 计算异常/by 0;提示在第9行有个异常事件
那么如何让程序完美运行,并不显示异常?
我们可以使用try-catch:
我们可以看到程序捕捉到了异常,之后输出“Catch Exception!”
有兴趣想知道try-catch运行机制可以看MOOC,翁凯老师的课(MOOC--Java异常处理机制)
这样我们可以知道这个程序有异常事件的发生,但是只知道有异常事件的发生并不够,我们要知道到底是什么异常事件发生了,我们可以这样做,直接让程序输出e:
这时我们可以看到第一个代码图那样,只不过这时候的异常显示从红色变成了蓝色,看着没有那么难受了,哈哈。
还有一个try-catch进阶版(个人笑称):
我们可以看出来一个try语句有多个异常处理机制(分别指定不同的Exception)
finally方法:在try程序段中一旦有一个被调用方法产生异常事件,该方法后的程序块将不被执行,直接执行catch()方法,不论哪个catch()方法被执行,该语句后的程序段总被执行。因此,finally语句的程序代码为该程序提供一个统一的出口。以上面的例子为基础:
由此可以看出finally语句永远会被执行,作为一个统一的出口。
除了try-catch显示异常以外,我们也可以用throw进行异常抛出:
public class throw1{
static void validate(int age){
if(age<18)
throw new ArithmeticException("not valid,because of ArithmeticException.");
else
System.out.println("welcome to vote");
}
public static void main(String args[]){
validate(13);
System.out.println("rest of the code...");
}
}
输出结果:
Exception in thread main java.lang.ArithmeticException:not valid,because of ArithmeticException.
为了实现异常抛出,我们一般将其定义成以下格式:
【<修饰符>】<类型><方法名><参数表>throws<异常类名>{
...
throw<异常名>;
...}
有兴趣的同学可以看一下throw 和throws的区别(throw Vs throws(点击链接))
除了系统的异常抛出,我们可以自定义异常处理类:
public class CatchClass1 extends Exception {
int number;
CatchClass1(int number) throws Exception {
/*Given the different exception information according to the value of number,
this is just a simple example, complex is also a reason, according to the value of the different, custom give exception information.*/
this.number = number;
if(number < 0) throw new Exception("The number must be greater than 0.");
}
//Test methods
public static void main(String[] args) throws CatchClass {
try {
CatchClass1 CatchClass = new CatchClass1(-1);
} catch (Exception e) {
System.out.print(e.toString());
}
}
}
运行结果:
java.lang.Exception: The number must be greater than 0.
注意事项:
catch不能独立于try;
finally并非强制要求添加;
try 既不能没有catch也不能没有finally;
在此良心奉献一本书的上册~~~里面干货满满(
链接:https://pan.baidu.com/s/1HISqQNIerUmY24ZBmf7RIA 密码:y04l
)
以上就是我对异常处理的理解吧,我之前发的博客里面有许多干货,大家可以看看哟
(萌新初来乍到,如有错误请大佬指出,谢谢)