Java异常处理机制

参考: w3c中关于异常处理


Java异常处理机制结构图:

这里写图片描述

从大体来分异常为两块:

error
错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。
Exception
异常 :异常可分为运行时异常跟编译异常
1)运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
2)编译异常:RuntimeException以外的(Exception类下的)异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。

一个简单的异常Demo演示:

class Car{
    String model;

    public Car(){

    }

    public Car(String model){
        this.model = model;
    }
    public void printModel(){
        System.out.println("the model of the car is"+model);
    }
}

public class NullExceptionDemo1 {

    Car myCar;

    void start(){
        myCar.printModel();
    }

    public static void main(String[] args){

        NullExceptionDemo1 exception = new NullExceptionDemo1();
        exception.start();
        System.out.println("start");

    }
}

main方法试图执行exception的start(),但是由于start()实际是对
成员变量myCar的printModel()的调用,而myCar根本就没有通过new来创建一个实例。。

编译不会有问题,但运行会报错

Exception in thread “main” java.lang.NullPointerException
at exception.NullExceptionDemo1.start(NullExceptionDemo1.java:23)
at exception.NullExceptionDemo1.main(NullExceptionDemo1.java:29)

这是异常发生时,Java虚拟机的一个错误输出。
由于在NullExceptionDemo01中没有对myCar进行是否为null
的检查,而执行的代码又在调用myCar的方法,异常就会抛出

加入异常处理:

class Car{
    String model;

    public Car(){

    }

    public Car(String model){
        this.model = model;
    }
    public void printModel(){
        System.out.println("the model of the car is"+model);
    }
}

public class NullExceptionDemo2 {

    Car myCar;

    void start(){
        myCar.printModel();
    }

    public static void main(String[] args){

        NullExceptionDemo2 exception = new NullExceptionDemo2();

        try {

            exception.start();
            System.out.println("start");
        } catch (NullPointerException e) {
            // TODO: handle exception
            System.out.println("get Exception: "+ e.getMessage());
        }


        System.out.println("end");

    }
}

输出:

get Exception: null
end

由于加入了对NullPointException的捕获(catch)代码,会
简单的输出异常信息

此处可能会有疑问,捕获异常之后为什么没有执行
System.out.println(“start’);
而这涉及到try-catch-finally的相关异常执行流程。

try-catch-finally的相关异常执行流程

1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

2)当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

3)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

抛出异常的方法:

throws抛出异常


class Car{
    String model;

    public Car(){

    }

    public Car(String model){
        this.model = model;
    }
    public void printModel(){
        System.out.println("the model of the car is"+model);
    }
}
class InstantInitException extends Exception{

    public InstantInitException(String message){
         super(message);

    }

    public void InstantNotInitException(){

    }


}

public class NullExceptionDemo3 {

    Car myCar;

    void start() throws InstantInitException{
        if(myCar==null)
            throw new InstantInitException("myCar is null");
        myCar.printModel();
    }

    public static void main(String[] args){

        NullExceptionDemo3 exception = new NullExceptionDemo3();

        try {

            exception.start();
            System.out.println("start");
            return;
        } catch (InstantInitException e) {
            //InstantInitException为NullPointException时报错
            // TODO: handle exception
            System.out.println("get Exception: "+ e.getMessage());
        }


        System.out.println("end");

    }
}

start()中对myCar进行检查,
如果为null,则使用throw抛出一个自定义的异常。

注意:

throw进行异常的抛出时
若一场未非RuntimeException,那么
方法的声明后必须显示使用throws进行说明抛出的异常种类

而后main()对start的调用就必须显示加上对这个异常进行捕获的catch语句

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值