java中的异常
异常的概述
生活中的异常
异常的情况我们在生活中经常发生,比如我们上学,上班的在路上花费的时间是半个小时,但是因为车多,人多等等因素或导致无法按时到达,甚至还可能碰见车祸,这都是生活中的异常。
程序中的异常
我们在运行程序时,可能会出现错误,运行的程序的窗口会出现红字警告。那就是异常。比如这样:
syso(“%d/%d=%d”,mu1,mu2,num3);
我们如果给第二个赋值0,那么程序就会出现这样的异常:
java.lang.ArithmeticException:by/zero
而程序一旦出现异常,程序就会立即结束,不仅仅计算的语句不会执行,而且其他的语句也无法进行下去。那么如何处理这些异常操作呢?我们可以加入if-else操作。
if(nmu2==0)
{ syso("输入的数是0,程序退出");
system.exit(1);
}
但是通过if-else处理异常有以下的缺点:
代码臃肿;
程序员把相当多的精力放在处理异常的代码上,放在了赌漏洞上,减少了编写业务代码的时间,必然影响开发的效率;
很难将所有的异常都穷举出来,程序仍然不健壮;
异常代码和业务交织在一起,影响代码的可读性,加大了程序的维护的难度;
所以如果将堵漏洞的工作完全交给计算机处理,用户只关注与业务的代码的编写,对异常的处理只要用来调用相应的处理方式就好了。而java就是这么做到。
什么是异常?
异常就是在程序运行过程中所发生的的不正常的事件,所需要的文件找不到,网络连接不通或者中断,算术运算错误(如除0)。数组下标越界,装载了一个不存在的类,对null对象的操作。类型转化异常等。异常会中断正在运行的程序。
异常的处理
什么是异常的处理
java中关于异常的处理是通过五个关键字来实现的。try,catch,finally,throw,throws。下面依次进行介绍。
try—catch
对于异常的处理我们可以将异常代码放入try语句中。
int date=0;
try {
int num=5/date;
} catch (Exception e) {
e.printStackTrace();
}
try-catch 程序块的执行流程比较简单,首先执行的是try语句中的语句,这时可能有下面3种情况:
1.如果try执行结束,不会发生异常,那么catch中的所有的语句都会被忽略。
2.如果try执行过程中遇到异常,并且这个异常和catch所声明的异常类型匹配,那么try剩下的代码将被忽略,而相应的catch块将会被执行。匹配是说catch中异常的类型和生成的异常一致或者是它的父类。
3.如果try执行过程中遇到异常,而catch并没有匹配的,则程序立刻退出。
异常中对异常信息的输出有两种方式:
printStackTrace和getMessage();第一种是输出堆栈信息,第二种是返回异常信息的描述字符串。
常见的异常:
exception 异常层次结构的根类
ArithmeticException 算术错误情况
ArrayIndexOutOfBoundsException 数组下标越界
NullPointexception 尝试访问Null数据
ClassNotFoundException 不能加载类
Try-catch-finally块
如果我们在运行的时候,无论是否发生异常都会提示程序结束,那应该怎么办呢?
加上一个finally快就可以很好的解决这个问题。同样这样快大致可以分成两种情况。
1.try正常执行结束,finally继续执行。
2.try执行过程碰到异常,无论是否能被catch匹配,都会执行finally块。
要注意,try-catch-fianlly块中try是必须的,而后面这两个是可选的,但是这两种必须至少拥有一个。== 特别要注意的是,即使try块和catch块中有return语句,finally块中的语句都会执行。发生的顺序是执行try或者catch中return语句之前的语句,执行finally语句,执行try或者catch中的return语句退出。==
多重Catch块
一段代码可能会引起多种类型的异常,这时,可以在一个try语句块后面跟多个catch语句块。分别处理不同的异常。但排列的顺序必须是从子类到父类,最后一个一般都是Exception类。因为所有的异常子类都继承exception类,所以如果将父类异常放到前面,那么所有的异常都将被捕获,后面catch块的子类异常将得不到被执行的机会。
在运行的时候,系统从上到下分贝对每个catch语句进行处理的异常类型进行检查,并执行第一个与异常匹配的catch的语句。执行第一个catch后,其他的都会被忽略。
声明异常——throws
对异常的处理我们可以进行两种方式。
try-catch捕获并处理异常。
通过throws继续声明异常。如果调用者不打算处理异常,则可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将有java虚拟机来处理。
public static void main(String[] args) throws Exception {
抛出异常
抛出异常-throw
在java语言中,还可以使用throw关键字来自行抛出异常。原因:由于当前的环境无法解决参数问题,因此在方法内通过throw抛出异常,把问题交给调用者去解决。
public static void main(String[] args) throws Exception {
int date=0;
if(date>0){
System.out.println(date);
}else{
throw new Exception("date 必须大于0");
}
}
throw和throws的区别表现在以下3个方面:
1.作用的位置不同:throw 用于在程序中抛出异常;throws用于声明在该方法内抛出了异常。
2.使用的位置不同:throw位于方法体内部,可以作为单独的语句使用;throws必须跟在方法参数的后面,不能单独使用。
3.内容不同:throw抛出一个异常对象,而且只能是一个,throws后面跟异常类,而且还可以跟多个异常类。