【Java】之异常处理机制

1、 异常的概念

所谓异常就是程序在运行过程中发生的各种问题,这些问题的出现导致程序无法继续往下运行。

1.1、Throwable类

在Java中,把异常信息封装成了一个类,当出现问题时就会创建异常类对象,并抛出与异常相关的信息。Throwable就是这样一个类,它是Java中所有错误或异常的超类(父类)。
Throwable有两个实现类:Error和Exception。
Error:错误,用于指示合理的应用程序不应该试图捕获的严重问题,即指该问题不是因为程序的原因为产生,而是由于硬件或其他非程序原因产生的,通过程序本身无论如何都无法解决的问题。就好比一个人得了绝症,不管使用任何方式都无法使其痊愈。
Exception:异常,它指出了合理的应用程序想要捕获的条件,即指只要通过程序将异常处理掉,程序就可以继续运行的问题。就好比一个人得了感冒,通过吃药就可以恢复健康。

1.2、异常的处理过程

1.当某程序执行到某段代码时出现了问题,若JVM能识别出这个问题,则执行以下流程:
(1)创建一个内置的异常对象
(2)将异常抛出,抛给方法的调用者。
2. 方法的调用者接收到异常,对异常进行处理,若无法处理,则继续抛给上一层的方法调用者。
3. 若所有的调用者都无法处理这个异常,则将异常抛给JVM。
4. JVM接收到异常后:
(1)将异常信息输出到控制台
(2)将程序停止。

2、异常的分类

异常可分为:编译期异常、运行时异常。
编译期异常:语法错误、调用了已声明异常的方法都会发生编译期异常。如果不将编译期异常处理,将编译失败,Java程序无法编译成字节码文件。
运行时异常:指在编译期不会发生,而发生在运行时期的异常,即可以通过编译,但在运行时会出现异常而导致程序停止。
若在方法内部throw的异常为RuntimeException或其子类,则如果该异常发生,为运行时异常。

3、throw 关键字

作用:用于手动抛出异常
特点
1.作用在方法内部;
2.使用格式为:throw new 异常类对象;(该异常类对象必须是Exception类或其子类),如对某个变量进行判断,若不满足条件则抛出异常:

public void add(int a){
	if (a < 10) {
			throw new Exception("输入数据不正确");
		}
}

4、throws 关键字

作用:用于声明此方法可能出现异常,请调用者处理
特点
1.作用在方法声明上;
2.throws后面要跟异常对象对象名;如上述例子中应在方法声明上抛出一个异常

public void add(int a) throws Exception{
	if (a < 10) {
			throw new Exception("输入数据不正确");
		}
}

3.当调用了一个声明了异常的方法时,调用者必须处理这个异常或者也声明抛出一个异常;如调用上述add方法时应处理Exception异常或者也声明异常:

public static void main(String[] args)  throws Exception{
	add(9);
}

或:

public static void main(String[] args) {
	try {
		add(9);
	}catch(Exception e){
		e.printStackTrace();
	}
}

运行结果:

java.lang.Exception: 输入数据不正确
	at cn.java.throwable.testThrowable.function1(testThrowable.java:15)
	at cn.java.throwable.testThrowable.main(testThrowable.java:6)

*子父类的异常声明关系若父类没有没有抛出异常,则子类不得抛出异常;若父类抛出异常,子类可抛可不抛;即,子类只能抛出比父类小的异常

5、异常处理

5.1、try…catch…

1.格式:

try{
	//需要处理的异常代码块
}catch(异常对象 对象名){
		//对异常处理
}finally{
		//必须要执行的代码块
}

2.要点:
a、经过try…catch的异常处理后,原来因为出项异常而没有被执行到的代码内容可以继续执行
b、catch(异常对象 对象名){}这里的异常对象应与被调用的方法声明的异常对象保持一致或是其父类
c、catch代码块中对异常的处理方式可以是——循环、判断、调用方法、调用变量,或者输出打印异常信息
d、try…catch中可以同时处理多个异常,即可以出现多个catch,但是catch中异常对象的出现顺序必须是按继承关系由小到大出现,即先出现子类再出现父类。若两个类为同级类则顺序可以是任意的
e、finally中为无论异常是否出现都会执行的代码,通常用于释放资源

5.2、运行时异常的处理

运行时异常有如下特点:
若方法内部抛出的异常为运行时异常(RuntimeException或其子类),则该方法声明上可以不写throws语句,而且方法的调用者也不可以不处理这个异常。原因是:运行时异常是不允许发生的,一旦发生即便调用不处理,JVM也会自动将这个异常抛给用户,让用户去处理,所以调用者不throws、不处理也可以通过编译。当然,调用者也可以对异常进行处理,以便即便异常出现也不影响后面的程序运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值