Java异常 Exception类及其子类

C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象。

Java异常处理通过5个关键字try、catch、finally、throw、throws进行管理。基本过程是用try包住要监视的语句,如果在try内出现异常,则异常会被抛出,catch中捕获抛出的异常并做处理,finally一定会完成未尽事宜。

练习:

package com.swift;

public class Exception1
{
    public static void main(String args[]){
        System.out.println("=========计算开始=========");
        try{
            int i=Integer.parseInt(args[0]);
            int j=Integer.parseInt(args[1]);
            int temp=i/j;
            System.out.println("计算结果:"+ temp);
        }catch(ArithmeticException e){
            System.out.println("出现了数学异常 "+ e);
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("出现了数组异常 "+ e);
        }catch(NumberFormatException e){
            System.out.println("出现了格式异常 "+ e);
        }catch(Exception e){
            System.out.println("其他异常 "+e);
        }finally{
            System.out.println("不管是否有异常,我都执行。");
        }
        System.out.println("=========计算结束=========");
    }
}

throws标识此方法出异常但不处理,谁调谁处理。

package com.swift;

public class Exception3
{
    public static void main(String args[]) throws Exception{
        Operate o=new Operate();
        System.out.println("=============计算之前==============");
        
            int temp=o.div(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
            System.out.println("计算结果"+temp);
        System.out.println("=============计算之后==========");
    }
}
class Operate
{
    public int div(int i,int j) throws Exception{
        int temp=i/j;
        return temp;
    }
}

如果main也throws了,异常抛给了JVM,其实你一个throws不写,JVM依然会默默地处理着异常

注意:一旦方法throws,main必须有回应,否则编译不过。main继续抛相当于出异常之后的程序戛然而止(没有"=============计算之后=========="),这时可用catch捕获抛来的异常进行处理。

package com.swift;

public class Exception3
{
    public static void main(String args[]) throws Exception{
        Operate o=new Operate();
        System.out.println("=============计算之前==============");
        try {
            int temp=o.div(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
            System.out.println("计算结果"+temp);
        }catch(Exception e){
            System.out.println("出现了什么异常情况 "+e); 
        }
        System.out.println("=============计算之后==========");
    }
}
class Operate
{
    public int div(int i,int j) throws Exception{
        int temp=i/j;
        return temp;
    }
}

异常被处理,计算前后正常输出。

throw与throws不同,throw抛出的不是异常类,而是对象,可以人造的对象。

package com.swift;

public class Exception4 {
    public static void main(String args[]) {
        try {
            throw new Exception("抛着玩呢 "); // 抛出人造异常对象
        } catch (Exception e) { // 再捕捉这个对象
            System.out.println("你抛的是什么呢?"+e);
        }
    }

}

如果不想抛Exception类的对像,要抛自己的

package com.swift;

public class Exception5 {
    public static void main(String args[]) {
        try {
            throw new MyException("自定义异常。");
        } catch (Exception e) {
            System.out.println("这个异常是 " + e); // e.printStackTrace();
        }
    }
}
//通过继承实现自己的异常类
class MyException extends Exception {
    public MyException(String msg) {
        //把参数传给父类
        super(msg);
    }
}