异常处理:
注:
1.异常是运行期出现的错误;观察错误的名字和行号最重要!!
2.捕获异常的时候,要先捕获小的异常再捕获大的异常,注意异常层次。
1.Java异常概念
(1)Java异常时Java提供的用于处理程序中的错误的一种机制;
(2)所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界所要读取的文件不存在);
(3)设计良好的程序应该在异常发生时提供处理这些错误的方法,使的程序不会因为异常的发生二阻断或产生不可预见的结果;
(4)Java程序的执行过程中去如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)异常;
(5)当Java运行时系统接收到异常时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这以过程称为捕获(catch)异常。
2.Java异常的分类
J2SDK中定义了很多异常类,这些类对应了各种各样可能出现的异常事件。
(1)Error 错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理(系统生成的异常,不需捕获,也捕获不了)。
(2)Exception 所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获(一般要捕获的异常)。
(3)RuntimeException 一类特殊的异常,如被0处、数组下标超出范围等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大,因此由系统自动检测并将它们交给缺省的异常处理程序,用户课不必对其处理(可以捕获处理,但不需捕获的异常)。
3.异常的捕获和处理
例:
public void someMethod(){
//声明该方法可能抛出的异常
throes SomeException{
if(someCondition()){
//构造并抛出异常对象
throw new SomeException("错误原因");
}
}
}
//尝试捕获异常;
try{
System.out.println(2/0);//异常语句
}catch(ArithmeticException ae){ //捕获异常;ae为自定义的异常的名字
System.out.println("异常提示");
ae.printStackTrace(); //printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容;打印错误堆栈信息;
}catch(SomeException ae){ //一个try可以有多个catch;
System.out.println(ae.getMessage());//getMessage()方法,用来得到有关异常事件的信息;
}finally{ //异常处理的出口,不管有没有捕获到异常都会执行,通常用来进行资源的清除工作;
try{
in.close();//关闭;
}
}
//throws 抛出异常,当下方法已经捕获到异常但不处理异常,若调用该方法时需要处理该异常;
void m(int i) throws ArithmetcException{
if(i==0){
throw new ArithmetcException("被除数为0");
}
}
Java的例外处理机制使得例外事件沿着被调用的顺序往前寻找,只要找到符合该例外种类的例外处理程序。
4.使用自定义的异常
步骤:
1.通过继承java.lang.Exception类声明自己的异常类;
2.在方法适当的位置生成自定义异常的实例,并用throw语句抛出;
3.在方法的声明部分用throws语句声明该方法可能抛出的异常。
注:重写方法需要抛出与原方法所抛出异常类型一致或不抛出异常。
例:
//继承
class MyException extends Exception{
//成员变量
private int id;
//构造方法
public MyException(String message,int id){
//调用父类的一个方法
super(message);
this.id = id;
}
public int getId(){
return id;
}
}
public class Test{
//抛出异常
public void regist(int num) throws MyException{
if(num<0){
throw new MyException("人数为负值,不合理",3);
}
//若正常则打印
System.out.println("登记人数"+num);
}
public void manager(){
try{
regist(100);
}catch(MyException e){
System.out.println("登记失败,出错类型码="+e.getId());
e.printStackTrace();
}
System.out.print("操作结束");
}
public static void main(String[] agrs){
Test t = new Test();
t.manager();
}
}