异常处理

异常的定义

1.异常是在代码序列运行时出现的非正常事件,是特殊的运行错误对象。异常的发生将阻止程序正常运行,并可能出现以下两种情况。

1)程序运行终止,控制权返回给操作系统

2)程序运行终止,系统死机崩溃状态

异常类

1.java提供了以Throwable类为基类的一系列异常类和错误类。throwable有两个直接的子类--Error(错误类)和Exception(异常类),Error类代表程序出现的错误,如程序运行时系统内部错误或资源耗尽等。这种错误是不能通过修改程序代码来恢复的。Exception类,代表程序出现的异常。

2.Exception类包括运行异常类(RuntimeException及其子类)和非运行异常类,运行异常类的产生一般由程序员的编程错误引起,完全可以通过改进程序避免,所以java编译器对此类异常不进行检查。非运行异常类是由运行环境引发的异常,eg:文件读写错误,数据库连接不通,找不到文件等。所以java编译器要求java程序必须捕捉或处理所有非运行异常。

常见的异常类

Throwable常见方法

异常处理

1.java中异常处理是通过try……catch……fianlly语句来实现的,具体格式为:

try{
    可能抛出异常的语句
}
catch(异常类型1 异常对象){
    对异常类型1对象的处理
}
catch(异常类型2 异常对象){
    对异常类型2对象的处理
}
…… …… ……
catch(异常类型n 异常对象){
    对异常类型n对象的处理
}
finally{
    不管是否出现异常,必须执行的语句
}

说明:

1)将有可能出现异常的代码用try-catch语句块进行处理,当try语句块中的代码运行出现异常时,则进入catch语句块,从上至下依次与catch语句块中的异常类型进行查找匹配(检查以抛出的异常对象类型是否与该catch语句块中指定的异常类型相同或为其子类)执行完catch代码块中的程序代码后,将继续执行catch代码块后的其他代码,而不会执行try代码块中发生异常语句后面的代码。

2)在异常处理中,最多有一个catch语句块会被执行。另外,如果有多个catch语句块,且catch语句块中的参数所指定的异常类型有父子继承关系,则要求处理子类异常的catch语句块放在处理父类异常的catch语句块的前面。否则会出现编译错误。

3)由于finally语句块中的代码肯定会被执行,所以通常在finally语句块中进行资源的清除工作。

在方法中抛出异常

1.若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。

使用throws关键字抛出异常

1)throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。

2)如果是Error、RuntimeException或它们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

使用throw关键字抛出异常

1)throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指定要抛出的异常;如果要捕获throw抛出的异常,则必须使用try-catch语句块。

2)throw通常用来抛出用户自定义异常。

自定义异常类

1.自定义异常类必须继承Exception类或其子类

class MyException extends Exception{
    public MyException(String ErrorMessage) {
        super(ErrorMessage);
    }
}        

2.自定义异常的抛出

1)自定义异常不可能依赖系统自动抛出,因为系统不知道错误在哪里,所以需在自定义的出错位置借助于throw语句抛出自定义的异常类对象。用throw语句抛出异常对象的语法格式为:

修饰符 返回类型 方法名(参数列表)throws 异常类名列表{
    …… …… ……
    throw 异常类对象
    …… …… ……
}

说明:

1)一般这种抛出异常的语句应该被定义为在满足一定条件时执行。

2)含有throw语句的方法。应该在方法头定义中增加“throws 异常类名列表"。如果方法中的throw语句中不止一个,则在异常类名列表中一一列出,中间用逗号隔开。

public class Test {
    static int dev(int number1,int number2) throws MyException,IOException{
        if(number1<0||number2<0) {
            throw new MyException("不可以使用负数");
        }
        if(number1>100||number2>100) {
            throw new MyException("数值太大");
        }
        return number1/number2;
    }
    public static void main(String[] args) {
        try {
            int result=dev(10,0);
            System.out.println(result);
        }
        catch(MyException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }
}

异常使用原则

1.在当前方法声明中使用try-catch语句捕获异常

2.一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类

3.如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常

注:Error、RuntimeException或它们的子类,可以不使用throws关键字来声明要抛出的异常

//原则2
public class Text extends father{
    public void fun() throws ClassNotFoundException{

    }
    public static void main(String[] args) {

    }
}
class father {
    public void fun() throws IOException,ClassNotFoundException{

    }
}


//原则3
public class Text extends father{
    public void fun() throws ClassNotFoundException,FileNotFoundException{

    }

    public static void main(String[] args) {

    }
}
class father {
    public void fun() throws IOException,ClassNotFoundException{

    }
    public void fun1() throws FileNotFoundException{

    }
}

java编程入门4 异常处理-LMLPHP

2018-11-25

11-26 10:27