Java异常学习笔记

一、Java异常处理顺序与匹配原则

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class FirstException extends Exception {
	public FirstException(String s){};
}

class SecondException extends Exception {
	public SecondException(String s){};
}
public class MultiException {
	
	public static void main(String[] args) {
		
		//一个try块中可能同时抛出多个类型的异常,可以在后面分别用catch语句捕获处理
		try {
			BufferedReader	reader = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("please input a String");
			String a = reader.readLine();
			throw new FirstException("one");
			//System.out.println("continue running 1");	抛出异常后不会再返回到try块里面去执行throw后面的语句
		} catch (FirstException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
		try {
			throw new SecondException("two");
			//throw new FirstException("one");			不可达语句,意味着永远也执行不了
		} catch (Exception e) {
			e.printStackTrace();
		} /**catch (SecondException e1) {		//同样不可达,因为SecondException就是一个Exception,异常会始终会被上一个语句捕获
			e1.printStackTrace();
		}**/ finally {
			System.out.println("continue running 2");
		}
		
		
		System.out.println("continue running 3");
	}
}

程序的大致执行顺序如下:

第一步:程序进入try块以后先从控制台获得一个字符串,这个过程可能会产生IOException,然后又抛出了FirstException,因而整个try块有可能抛出两种异常,但只能抛出一个异常。

第二步:抛出异常后,程序立马转到相应的异常处理块,所以"contiune running 1"永远不会执行,因而没法通过编译;即使程序产生的是IOException,其进入相应catch块后,也不会再返回到try块中去执行“throw new FirstException”。

第三步:程序进入第二个try块,抛出了SecondException异常,然后进入异常处理块。这里我们可以看出,异常处理并不要求同处理程序中所声明的异常完全匹配,派生类的对象也可以匹配其基类的的处理程序。由于SecondException就继承至Exception,所以其永远无法得到匹配,因而不能通过编译。

第四步:不管try块中有没有抛出异常,都一定去执行finally中的语句,所以"continue running2"得到执行;最后程序打印“continue running 3”;

二、如何屏蔽被检查异常

Java的异常处理机制虽然能提高程序的健壮性,但也有其弊端,它要求编程者在可能没有做好怎么处理异常的准备(或者根本不想处理)的时候被迫加上catch,这样可能会影响程序员的开发效率,因而我们可以采用一下方式来避免被检查异常:

方式一:将异常传递给控制台

通过在给main()函数加上异常声明Exception(所有被检查异常的基类),我们就不用在main里面写try-catch()语句,异常都会被传递到控制台

方式二:异常封装

try {
	......
} catch (UnknowException e) {
	throw new RuntimeException(e);
}

对于不知道该如何处理的异常e,我们可以将它封装到RuntimeException中,e就是RuntimeException(cause)构造函数的cause,即e是造成RuntimeException的原因。


三、通过嵌套try块来释放系统资源

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class ResourseRelease {

	public static void main(String[] args) {
		try {
			BufferedReader in = new BufferedReader(new FileReader("input.txt"));
			try {
				String s;
				int i=0;
				while ((s = in.readLine())!= null) {
					i++;
					System.out.println(s);
				}
			} catch (Exception e) {
				e.printStackTrace(System.out);
			} finally {
				in.close();
			}
		} catch(Exception e) {
			System.out.println("open file failed");
		}

	}

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值