Java 异常

异常的概述

没有人能保证自己的程序永远不会出现错误,就算能够提前预知到发生的错误,用条件语句来对错误进行处理,但事实上世界上的意外是不可穷举。要处理意外错误的方法,可以使用java提供的异常处理机制解决这个问题。

try---catch

其实可以将try---catch理解为一种非常强大的if---else块,例如:
//try---catch
try{
//执行代码
要执行的业务代码
}
//如果有异常被抛出则扑捉异常并处理
catch(Exception e){
异常的处理
}
//----------------------------
//if---else
//如果一切正常没有出现错误,则正常运行代码
if(一切正常){
业务代码
}
//否则对出现的错误进行处理
else{
错误处理
}

异常的继承关系

在这里插入图片描述Java将所有非正常的情况分为错误类(Error)和异常类(Exception),Error类的错误一般指与虚拟机有关的问题,如系统奔溃、虚拟机错误、动态链接失败等,这种错误无法捕获或者恢复,将直接造成应用程序的中断。

Checked异常体系和Runtime异常体系

所有的RuntimeException类及其子类异常被称作Runtime异常体系,其他异常为Checked异常体系,RuntimeException体系的异常不需要显式声明抛出或者捕捉,如果需要捕捉也可以使用try---catch块来进行捕获处理。 Checked体系的异常被认为是可修复的异常,要么显式的声明抛出要么捕获处理,不可对Checked的异常不闻不问。

Throws 和Throw

throws是声明在方法体后,告知可能发生异常。而throw是用在方法体中,直接抛出异常,例子如下:
public class Test{
public static void main (String[] args)throws IndexOutOfBoundsException{
try{
String a=args[0];
String b=args[1];
System.out.println("这两个数相加的和是:"+(a+b));
}
catch(IndexOutOfBoundsException e){
//如果捕获到异常输出提示
System.out.println("发生一个异常,可能是数组越界造成的");
System.out.println(e.getMessage());
//然后抛出一个新的异常
throw new IndexOutOfBoundsException();
}

结果如图
在这里插入图片描述

自定义异常类

在通常情况下,程序很小会自行抛出系统异常,因为异常的类名通常也包含了改异常的有用信息。所以在选择异常抛出时,应该选择合适的异常类,从而可以明确地描述该异常的枪口。在这种情形下,用程序常常需要抛出自定义异常。 用户自定义异常都应该继承Exception基类,如果希望定义Runtime异常,则应该继承RuntimeException基类。定义异常类时,常常需要提供两个构造器:一个是无参构造器;另一个是带一个字符串参数的构造器,这个字符串将作为该异常对象的描述信息(也就是异常对象的getMessage()方法的返回值)下面定义了一个自定义异常类
public class AuctionException extends Exception{
//无参构造器
public AuctionException(){}
//带一个字符串的构造器
public AuctionException(String msg){
super(msg);
}
}

异常的跟踪栈

异常对象的printStackTrace()方法用于打印异常的跟踪栈信息,根据printStackTrace()方法的输出结果,开发者可以找到异常的源头,并跟踪到异常一路触发的过程。观察如下例子程序
public class PrintException {
	public static void main(String[] args) {
		first();
	}
	public static void first() {
		second();
	}
	public static  void second() {
		third();
	}
	public static void third() {
		//由于异常属于Runtime体系,不需要捕获,系统会隐式捕获执行printstackTrace()方法
		throw new MyException("自定义错误信息");
	}
}
class MyException extends RuntimeException{
	private static final long serialVersionUID = 1L;
	MyException(){}
	MyException(String msg){
		super(msg);
	}
}

输出结果如图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值