Java--异常的基本概念

异常时导致程序中断运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑各种异常的发生,并正确地做好相应的处理,这样才能保证程序的正常运行。在Java中一切的异常都秉着面向对象的设计思想,所用的异常都以类和对象的形式存在,除了Java中已经提供的各种异常类外,用户也可以根据需求要定义自己的异常类。

一. 为什么需要异常处理
在没有异常处理的语言中如果要回避异常,就必须使用大量的判断语句,配合所想到的错误状况来捕捉程序中可能出现的错误,但是为了捕捉到这些错误,编写出来的程序代码有大量的判断语句,有时这样也未必捕捉到所有的错误,而且这势必效率的降低。
Java的异常处理机制恰好改进这一点。它具有易于使用、可自行定义异常类、处理抛出的异常同时又不会降低程序运行的速度等优点。因而在Java程序设计时,应充分地利用Java的异常处理机制,以增进程序的稳定性及效率。
二. 在程序中使用异常处理
在Java中异常处理语句的格式:
【异常处理格式】

try{
    //可能出现异常的语句

}catch(异常类 异常对象){
    //编写异常的处理语句

}catch(异常类 异常对象){
    //编写异常的处理语句

}catch(异常类 异常对象){
    //编写异常的处理语句

}catch(异常类 异常对象){
    //编写异常的处理语句

}

....

finally{
    一定会运行的程序代码;
}

如果在try中产生了异常,则程序会自从跳到catch中找到匹配的异常类型进行相应的处理。最后不管程序是否会产生异常,都会执行到finally语句,finally作为异常的统一出口需要提醒的是,finally块是可以省略的。如果省略了finally块,那么程序在执行完try—catch块后将跳到catch之后运行。
【对异常进行捕获】

public class ExceptionDemo02 {
    public static void main(String[] args) {
        System.out.println("-----计算开始----");
        int i=10;
        int j=0;
        try {
            int temp=i/j;
            System.out.println("计算结果:"+temp);
            System.out.println("---------");
        } catch (ArithmeticException e) {
            // TODO: handle exception
            System.out.println("出现异常:"+e);
        }
        System.out.println("----计算结束----");
    }
}

运行结果:

-----计算开始----
出现异常:java.lang.ArithmeticException: / by zero
----计算结束----

从上述结果可以看出,所有的异常都在catch处理了,catch处理完毕后,程序正常结束。其实还可以加入finally关键字。
【验证finally关键字】

public class ExceptionDemo03 {
    public static void main(String[] args) {
        System.out.println("-----计算开始----");
        int i=10;
        int j=0;
        try {
            int temp=i/j;
            System.out.println("计算结果:"+temp);
            System.out.println("---------");
        } catch (ArithmeticException e) {
            // TODO: handle exception
            System.out.println("出现异常:"+e);
        }finally {
            System.out.println("不管是否出现异常,都会执行!");
        }
        System.out.println("----计算结束----");
    }
}

运行结果:

-----计算开始----
出现异常:java.lang.ArithmeticException: / by zero
不管是否出现异常,都会执行!
----计算结束----

当然在程序中不会只出现一个异常,如果出现多个异常,只需要使用多个catch语句进行处理就行。
【初始化参数并进行操作】

public class ExceptionDemo04 {
    public static void main(String args[]) {
        System.out.println("-----计算开始----");
        int i=0;
        int j=0;

        try {

            String str1=args[0];
            String str2=args[1];
            i=Integer.parseInt(str1);
            j=Integer.parseInt(str2);
            int temp=i/j;
            System.out.println("计算结果:"+temp);
            System.out.println("---------");
        } catch (ArithmeticException e) {
            // TODO: handle exception
            System.out.println("出现异常:"+e);
        }finally {
            System.out.println("不管是否出现异常,都会执行!");
        }
        System.out.println("----计算结束----");
    }
}
运行结果:
-----计算开始----
计算结果:2
---------
不管是否出现异常,都会执行!
----计算结束----

上面进行了正常运行,但是有以下问题
(1).没有输入参数,或者输入的参数不够时,程序会出现异常:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 0
(2).输入的参数不是数字时,也会出现异常:
Exception in thread “main” java.lang.NumberFormatException: For input string: “a”
所以改进之后:
【捕捉多个异常】

public class ExceptionDemo04 {
    public static void main(String args[]) {
        System.out.println("-----计算开始----");
        int i=0;
        int j=0;

        try {

            String str1=args[0];
            String str2=args[1];
            i=Integer.parseInt(str1);
            j=Integer.parseInt(str2);
            int temp=i/j;
            System.out.println("计算结果:"+temp);
            System.out.println("---------");
        } catch (ArithmeticException e) {
            // TODO: handle exception
            System.out.println("算术异常:"+e);
        }catch (NumberFormatException e) {
            // TODO: handle exception
            System.out.println("数字转化异常"+e);
        }catch (ArrayIndexOutOfBoundsException e) {
            // TODO: handle exception
            System.out.println("数组越界异常"+e);
        }
        System.out.println("----计算结束----");
    }
}

以上程序使用了3个catch语句处理3个不同的异常,但是如果每个程序的异常都使用这种方式处理则会很麻烦,因为在开发中很难知道到底会有多少个什么类型的异常,所以要解决这个问题,则首先要从异常的整体结构来看。
三. 异常类的继承结构
在整个Java的异常结构中,实际上有两个常用的类,分别为*Exception和Error,这两个类全是Throwable的子类。
Exception:一般表示的是程序中出现的问题,可以直接使用try-catch处理
Error:一般指的是JVM错误,程序中无法处理。*
异常信息输出的方式:
在catch语句输出异常时
1. System..out.println(异常对象);
2. e.printStackTrace();
第二种方法打印的信息是最完整的,建议以后用第二种方式。
四. Java的异常处理机制
在整个Java的异常处理中,实际上也是按照面向对象的方式进行处理,处理的步骤如下:
*(1) 一旦产生异常,则首先会产生一个异常类的实例化对象
(2) 在try语句中对此异常对象进行捕捉
(3) 产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码*
之前学习中清楚的知道,所有的子类实例化可以全部使用父类类型接收,那么就可以利用向上转型的概念,让所有的异常对象使用Exception接收。
【使用Exception】

public class ExceptionDemo04 {
    public static void main(String args[]) {
        System.out.println("-----计算开始----");
        int i=0;
        int j=0;

        try {

            String str1=args[0];
            String str2=args[1];
            i=Integer.parseInt(str1);
            j=Integer.parseInt(str2);
            int temp=i/j;
            System.out.println("计算结果:"+temp);
            System.out.println("---------");
        } catch (ArithmeticException e) {
            // TODO: handle exception
            System.out.println("算术异常:"+e);
        }catch (NumberFormatException e) {
            // TODO: handle exception
            System.out.println("数字转化异常"+e);
        }catch (ArrayIndexOutOfBoundsException e) {
            // TODO: handle exception
            System.out.println("数组越界异常"+e);
        }catch (Exception e) {
            // TODO: handle exception
            System.out.println("其他异常"+e);
        }
        System.out.println("----计算结束----");
    }
}

此时程序最后使用了Exception进行其他异常的捕获,那么此程序就可以接收所有的异常对象,但是要注意的是,在Java中所有的捕获范围小的异常必须在捕获范围大的异常之前,否则在编译时会出现错误。
另外不建议直接使用Throwable,因为此类中有Exception和error两个类,而Error类本身不需要程序处理,所以没有必要使用Throwable,同时进行捕获时,如果有多个异常,最好分别进行捕获,而不是直接使用Exception捕获全部异常。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aotulive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值