java编程入门4 异常处理

异常处理

异常的定义

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

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

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

异常类

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

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

常见的异常类

异常类 异常类描述 异常类别
ArithmeticException 算术错误 运行异常
ArrayOutOfBoundsException 数组越界使用 运行异常
NullPointerException 引用空对象 运行异常
IllegalArgumentException 参数无效 运行异常
NumberFormatException 数据格式不对 运行异常
SecurityException 安全性错误 运行异常
ClassNotFoundException 未找到欲装载的类 非运行异常
FileNotFoundException 未找到指定的文件或目录 非运行异常
IOException 输入、输出错误 非运行异常
InterruptedException 线程在睡眠、等待或其他原因暂停时被其他进程打断 非运行异常

Throwable常见方法

方法声明 功能描述
String getMessage() 输出错误性质
String toString() 给出异常的类型与性质
void printStackTrace() 指出异常的类型、性质、栈层次及出现在程序中的位置并输出至标准错误流
void printStackTrace(PrintStream s) 指出异常的类型、性质、栈层次及出现在程序中的位置并输出至指定的输出流

异常处理

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{

    }
}

2018-11-25