Java异常及其处理机制

Java把所有的非正常情况分成两种:异常(Exception)和错误(Error),它们都继承Throwable父类。
Error错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败 等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理 这些错误,因此应用程序不应该试图使用catch块来捕获Error对象。在定义该方法 时,也无须在其throws子句中声明该方法可能抛出Error及其任何子类。
异常类结构图:
在这里插入图片描述
异常发生的原因有很多,通常包含以下几大类:
(1)、用户输入了非法数据。
(2)、要打开的文件不存在。
(3)、网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
要理解Java异常处理是如何工作的,需要掌握以下三种类型的异常:

检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。

运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。

错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

Java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。当程序运行出 现意外情形时,系统会自动生成一个 Exception对象来通知程序,从而实现将“业务功 能实现代码”和“错误处理代码”分离,提供更好的可读性。
Java异常处理机制为:抛出异常,捕捉异常,处理异常。

try…catch语法格式:

try{
	//业务功能代码
}catch(异常类1 e1){
	//异常处理代码1
}catch(异常类2 e2){
	//异常处理代码2
}
......

在使用try…catch捕获处理异常时需要注意:
(1)、不要过度使用异常,不能使用异常处理机制来代替正常的流程控制语句
(2)、异常捕获时,一定要先捕获小异常,再捕获大异常。否则小异常将无法被捕获
(3)、避免出现庞大的try块
(4)、避免使用catch(Exception e){}
(5)、不要忽略异常

多异常捕获:
从Java7开始,一个catch块可以捕获多种类型的异常。
在使用一个catch块捕获多种类型的异常时需要注意:
捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开。
捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量 重新赋值。
格式如下:

try{
	//业务功能代码
}catch(异常1 | 异常2 | 异常3 e){
	//异常处理代码
}

throws/throw 抛出异常:
1、使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异 常应该由上级调用者处理;如果main方法也不知道如何处理这种类型的异常,也可以 使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是,打印 异常的跟踪栈信息,并中止程序运行。throws声明抛出异常的格式:

throws 异常类1,异常类2,异常类3,...

2、Java也允许程序自行抛出异常,自行抛出异常使用throw语句来完成(注意此处的 throw没有后面的s)如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用, throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。throw语句的语法格式:

throw 异常实例;

声明抛出一个 RemoteException 异常例子:

public void deposit(double amount) throws RemoteException
{
	 // Method implementation
	throw new RemoteException();
}

3、用户自定义异常都应该继承Exception基类;如果希望自定义Runtime异常,则应该继承RuntimeException基类。定义异常类时通常需要提供两个构造器:一个是无参数的 构造器;另一个是带个字符串参数的构造器,这个字符串将作为该异常对象的描述信息(也就是异常对象的getMessage()方法的返回值)。
格式:

class MyException extends Exception{}

只继承Exception 类来创建的异常类是检查性异常类。
下面的 InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。
一个异常类和其它任何类一样,包含有变量和方法。
自定义异常例子:

public class TestException {
	public static void main(String[] args) {
		try {
			shang(5,0);
		} catch (DivideNegativeException e) {
			e.printStackTrace();
		} catch (DivideZeroException e) {
			e.printStackTrace();
		}
	}
	public static int shang(int x,int y) throws DivideNegativeException, DivideZeroException{
		if(y<0){
			throw new DivideNegativeException("您输入的除数是"+y+", 除数不能为负数!");
		}
		if(y==0){
			throw new DivideZeroException("您输入的除数是"+y+", 除数不能为 0!");
		}
		int m = x/y;
		return m;
	}
}
class DivideNegativeException extends Exception{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;	
	//提供一个无参构造器
	public DivideNegativeException(){};
	//带一个字符串参数的构造器
	public DivideNegativeException(String msg){
		super(msg);
	}
}
class DivideZeroException extends Exception{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public DivideZeroException(){};
	public DivideZeroException(String msg){
		super(msg);
	}
}

输出结果:
在这里插入图片描述
finally关键字:
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:

try{
	// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}

通用异常:
在Java中定义了两种类型的异常和错误。
JVM(Java虚拟机) 异常:由 JVM 抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。
程序级异常:由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。

Checked异常和Runtime异常:
Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。
Runtime异常:所有的RuntimeException类及其子类的实例;
Checked异常:不是RuntimeException类及其子类的异常实例。
只有Java语言提供了Checked异常,其他语言都没有提供Checked异常。Java认为 Checked异常都是可以被处理(修复)的异常,所以Java程序必须显式处理Checked 异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。
Checked异常体现了Java的设计哲学:没有完善错误处理的代码根本就不会被执行!
Runtime异常则更加灵活,Runtime异常无须显式声明抛出,如果程序需要捕获 Runtime异常,也可以使用try…catch块来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值