异常

在这里插入图片描述
Throwable下的Excepion类需要我们注意,因为这个类是用来处理程序中人为造成的异常的。
异常分为运行时异常(比如把0当分母,能够编译,但是运行会有异常)和编译时异常,编译时异常必须先行处理。对于异常,我们可以捕获处理,也可以抛出处理。

1.捕获异常。
捕获异常常用的是try catch finally 语句块

public class Demo {
	
	public static void main(String[] args) {
		int [] nums = new int[4];
		
		try {
			System.out.println(1/0);
			System.out.println(nums[4]);
			System.out.println(nums[4]);
		}catch (ArithmeticException e) {
			e.printStackTrace();
			return;
		}catch (Exception e) {
			e.printStackTrace();
			return;
		}finally {
			System.out.println("就算在catch语句块中使用了return,finally语句块照样要执行");
		}
		System.out.println("捕获异常后程序继续执行");
	}
}

把可能出现异常的语句放入try语句块中,如果出现异常就把异常类型跟catch语句中的异常类型作比较,匹配成功就是执行catch中的语句。最后不管是否匹配成功,finally都将执行。就算在匹配成功的catch语句块中已经执行了return,finally还是会执行,但是区别在于:当没有执行过return时,执行finally后能继续执行后面的语句,如果是执行过return后才执行的finally,则在finally执行完毕后程序结束。仅当执行了System.exit(1),finally才不会执行。
值得注意的是,当在try中遇到了第一个异常后,try剩余的还没执行的语句均不再执行。

2.抛出异常
2.1 用throw抛出异常类创建的对象:比如

public class ThrowKey {

	public double div(double a,double b) {
		return a/b;
	}
	
	public static void main(String[] args) {
		int b = 0;
		if(b==0) {
			throw new UnsupportedOperationException();
		}
	}
}

要注意,如果抛出的是编译时异常的对象,则需要用try catch 或throws :比如

public class ThrowKey {

	public double div(double a,double b) {
		return a/b;
	}
	
	public static void main(String[] args) throws Exception {
		int b = 0;
		if(b==0) {
			//throw new UnsupportedOperationException();
			throw new Exception();
		}
	}
}
public class ThrowKey {

	public double div(double a,double b) {
		return a/b;
	}
	
	public static void main(String[] args) {
		int b = 0;
		if(b==0) {
			//throw new UnsupportedOperationException();
			try {
				throw new Exception();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

2.2用throws关键字抛出异常类: 比如

public class ThrowsKey {

	public static void main(String[] args) throws ArithmeticException,ArrayIndexOutOfBoundsException{
		try {
			System.out.println(1/0);
		} catch (Exception e) {
			e.printStackTrace();
		}
		int [] nums = new int [4];
		System.out.println(nums[5]);
	}
}

例子中System.out.println(1/0);已经被try catch语句块所包裹,ArithmeticException并不需要用throws抛出。System.out.println(nums[5]);没有被try catch语句块包裹,有必要使用throws抛出,但不是必要的,因为它并不是编译时异常。一般来说编译时异常要么自己 try catch处理,要么使用throws抛出,但抛出后一定是要处理的,这个异常不可能平白无故消失,只是有人替你把异常处理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值