Java异常处理

一、Java的异常

       指的是程序运行过程中,因为用户的误操作、代码的BUG、 等等一系列原因,引起的程序奔溃的现象,被称为异常。在计算机程序运行的过程中,总是会出现各种各样的错误。有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc

// 假设用户输入了abc:
String s = "abc";
int n = Integer.parseInt(s); // NumberFormatException!

还有一些错误是随机出现,并且永远不可能避免的。比如:

  • 网络突然断了,连接不到远程服务器;
  • 内存耗尽,程序崩溃了;
  • 用户点“打印”,但根本没有打印机;
  • ……

所以,一个健壮的程序必须处理各种各样的错误。

所谓错误,就是程序调用某个函数的时候,如果失败了,就表示出错。

因为Java的异常是class,它的继承关系如下:

    Throwable                异常的顶级类
        |-- Error            致命性的错误
        |-- Exception            常见的异常的父类
            |-- RuntimeException    运行时异常,只有运行时,才有可能出现异常
            
            其他的Exception的子类都是编译型异常,必须处理

二、 异常处理:
    解决掉异常的现象,让程序继续运行(不要奔溃退出)下去。
    程序容错能力提升!!!!程序就会越稳定!!!

java进行异常处理,有两种解决方案:
    |-- 捕获异常
    |-- 抛出异常

三、捕获异常

针对于可能出现异常的代码,进行抓捕
    
    try {
        // 可能发生异常的代码

    } catch (Exception e) {
        // 如果出现了一次,代码会立刻进入catch中
        // 在这儿解决抓捕到的异常
    } finally {
        // 必须要执行的代码
    }


如果使用抓捕异常,通过这种处理,程序即便是遇到了,也不奔溃!!!

四、try cath运行流程

1、出现异常的流程

2、不出现异常的流程

在Java中,凡是可能抛出异常的语句,都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中,然后使用catch捕获对应的Exception及其子类。

多catch语句

可以使用多个catch语句,每个catch分别捕获对应的Exception及其子类。JVM在捕获到异常后,会从上到下匹配catch语句,匹配到某个catch后,执行catch代码块,然后不再继续匹配。

五、多个异常的处理方案

如果某些异常的处理逻辑相同,但是异常本身不存在继承关系,那么就得编写多条catch子句:

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (IOException e) {
        System.out.println("Bad input");
    } catch (NumberFormatException e) {
        System.out.println("Bad input");
    } catch (Exception e) {
        System.out.println("Unknown error");
    }
}

因为处理IOExceptionNumberFormatException的代码是相同的,所以我们可以把它两用|合并到一起:

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (IOException | NumberFormatException e) { // IOException或NumberFormatException
        System.out.println("Bad input");
    } catch (Exception e) {
        System.out.println("Unknown error");
    }
}

六、finally关键字

无论是否有异常发生,如果我们都希望执行一些语句,例如清理工作,怎么写?

可以把执行语句写若干遍:正常执行的放到try中,每个catch再写一遍。例如:

try {
		// 可能存在异常的代码
	} catch(XxxException e) {
		// 异常处理代码
	} [finally {
	
	
	}]

	回收垃圾
	关闭IO流
	关闭数据库连接
	……

	核心必须要执行代码


	try {
	
	
	} finally {
		// 将必须要执行的代码写在finally中!!!
	}


注意:在开发过程中请注意,return关键字和finally关键字同时出现的情况,认真分析仔细考虑。

七、抛出异常

      可以通过创建异常(系统或者自定义),来给调用者一个确切的错误信息调用者就可以通过抛出的信息做成对应的判断。

当发生错误时,例如,用户输入了非法的字符,我们就可以抛出异常。

如何抛出异常?参考Integer.parseInt()方法,抛出异常分两步:

  1. 创建某个Exception的实例;
  2. throw语句抛出。

八、自定义异常

    接触到的都是属于java官方提供的异常类,
    自己设计异常类

    定义一个普通的类,让该类成为Exception类或者它的子类的子类


Java标准库定义的常用异常包括:

 当我们在代码中需要抛出异常时,尽量使用JDK已定义的异常类型。例如,参数检查不合法,应该抛出IllegalArgumentException

static void process1(int age) {
    if (age <= 0) {
        throw new IllegalArgumentException();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值