一、异常处理定义
1、异常是程序运行过程中非正常情况下出现的问题,没法预测的,但是能被处理的。
2、异常是程序运行期间出现的错误,而不是编译时的语法错误。
3、Java异常处理是Java独有的处理异常的方法。
4、程序在出现异常时会终止程序的运行,而异常处理目的就是在出现出现异常时,程序也能继续运行。
5、子类的异常可以通过对父类的异常进行解决。
二、异常的分类
(一)Error:虚拟机内部的异常
(二)Exception:程序在运行的过程中出现的异常
1、RuntimeException:运行时异常(非检查异常)
程序在执行出现的非正常现象:
(1)数组越界
(2)空指针
2、IOException:非运行时异常(检查异常)
程序在编译时必须处理的非正常现象
三、异常处理机制(方式)
(一)、异常产生过程
在Java程序执行过程中如果出现异常事件,系统会发出异常报告,这时系统将生成一个异常类对象,异常类对象封装了异常事件的信息并将其提交给Java运行时系统。
(二)异常的处理过程
(三)、异常处理的方法
1、自动处理
将可能引发异常的语句放入在try块内,而异常的相应语句则放入在catch块内。
try…catch语句
(1)catch块,是用来捕获并处理try块抛出的异常的代码块。没有try块,catch块不能单独存在。我们可以有多个catch块,以捕获不同类型的异常。
(2)如果程序抛出多个不同类型的异常,我们需要多个catch()语句来处理。
(3)特殊异常类相关联的catch()块必须写在普通异常类相关联catch()之前。即后面的catch()语句块捕获的异常类型必须大于前面的catch()语句块的异常类型。
(4)try{…}catch( ){…}之间不可以添加任何代码
(5)当不知道抛出什么异常是可以用catch(Exception e),但是阅读性不好,不能清楚在哪里抛出什么异常。
finally语句
(1) finally主要作用:释放资源 如:关闭打开文件、删除临时文件…
(2) 不管抛不抛出异常,finally都会执行。
(3)对应finally代码中的语句,即时try代码块和catch代码块中使用return语句退出当前方法或用break跳出某个循环,相关的finally代码块都会执行。
(4)当try或catch代码块中执行了System.exit(0)时,finally代码块中的内容不被执行
/
/捕获到异常立即执行catch,不会再执行出现异常后面的语句
try
{
//可能会出现的异常的代码
}
//只会在try捕获到异常时才会执行。
//如果出现异常将会去捕获,并把异常放入到形参e中
catch(Exception e) //Exception:出现异常的类型,不知道那个异常的可以填写其父类的类型或者是异常的根父类Exception
{
//对异常的处理的代码:打印异常信息
/*
* 1、获取异常信息,打印的只是出错的序列号,不是真正的错误信息。
* e.getMessage();
*/
/*
* 2、打印异常的堆栈信息,能准确找出出错的位置,方便程序员快速找出错误,解决问题。
* e.printStackTrace();
*/
}
finally
{
//代码
}
多异常处理实例
异常:://被除数不能为0; //数据越界
/*
* 利用try...catch进行多异常的处理
*/
package com;
public class TestException {
public static void main(String[] args) {
//定义三个常量m,n,result
int m=10,n=0;
int result;
//定义一个数组arry
int arry []={10,20,30,40};
//求m/n的值
result=m/n; //被除数不能为0
//打印数组的元素
for(int i=0;i<5;i++) //数据越界
{
System.out.println(arry[i]);
}
}
}
利用try…catch进行多异常的处理
package com;
public class TestException {
public static void main(String[] args) {
//定义三个常量m,n,result
int m=10,n=0;
int result;
//定义一个数组arry
int arry []={10,20,30,40};
//利用try...catch...finally处理多异常
try{
//求m/n的值
result=m/n; //被除数不能为0
//打印数组的元素
for(int i=0;i<5;i++) //数据越界
{
System.out.println(arry[i]);
}
}
catch(ArithmeticException e)
{
//打印异常的堆栈信息,方便程序员处理异常
e.printStackTrace();
}
catch(ArrayIndexOutOfBoundsException e)
{
//打印异常的堆栈信息,方便程序员处理异常
e.printStackTrace();
}
finally
{
System.out.println("程序执行结束...");
}
}
}
捕获异常1:被除数不能为0。根据提示修改代码—-》》把n=0修改为n=非零值
捕获异常2:数组越界。根据提示修改代码—-》》把i<5修改为i<4
处理异常后运行程序
2、回避异常(手动抛出异常)
(1)、在方法声明中包含throws子句,通知潜在调用者,如果发生了异常,必须由调用者处理。
(2)、自己处理不了,往上级抛出,上级处理该方法体中抛出的异常
(3)、用throws声明方法抛出异常,不进行处理。谁调用谁负责处理。
public class Test {
public static void main(String[] args) throws Exception {
//方法体
}
}
四、自定义异常类
如果Java提供的异常类型不能满足程序设计的需要,我们可以定义自己的异常类型。
用户自定义的异常类应为Exception类(或者Exception类的子类)的子类。