Java异常

1.Java异常体系
异常能使方法抛出一个异常对象给它的调用者。这个调用者可以处理该异常或继续向上抛出给其调用者直到往上抛出给main方法,所有的方法都是在main方法内被层层调用的,调用执行完毕后最终都要返回到main方法。
以库方法为例,被调用的库方法通常不知道出现错误以后应该怎么做,库方法可以检测出错误,但只有调用者才知道出现错误时需要做些什么。
异常处理最根本的优势就是将检测错误(由被调用的方法完成)从处理错误(由调用者完成)中分离出来,调用者只需要针对错误类型完成错误处理代码就可以了,而不必亲自添加繁琐的代码去检测错误以后再处理。

免检异常:
Error类及其所有子类,以及RuntimeException类及其所有子类,由JVM隐性抛出,不需要程序员来显性抛出,称为免检异常
必检异常:
Exception类中除RuntimeException类外的其余所有异常类,必须由程序员来显性抛出,称为必检异常
在这里插入图片描述
2.自定义异常类
系统已有异常类库不能满足使用要求时,可自定义异常类扩建异常类库。
系统自定义的异常类根类为Throwable类,Throwable类派生出2个子类Error/Exception类,异常子类——包括自定义异常类——均应继承自Error或Exception类,以继承这些异常类中已实现的功能。
自定义的异常类一般是检测运行时异常,因此应该继承自Exception类或其子类RuntimeException类。自定义的异常类可以扩展自RuntimeException类,但这会使得自定义异常类成为免检的,这不是一个好的做法。最好使自定义异常类成为必检的,这样编译器就可以在程序中强制捕获这些异常。以下均假设自定义的异常类继承了Exception类。
Java异常类是一种功能特殊Java类,但语法上和其它普通Java类没有区别。java提供相当多的异常类,尽量使用它们而不要创建自己的异常类,如果新问题不能用预定义的异常类来检测,可以抛出新情况给已有的预定义异常类,除非这样做也难以很好的解决问题时,才最终选择自己建立异常类。

/**
 * <b>自定义异常类<b/>
 */
public class SelfException extends Exception {

	private static final long serialVersionUID = 1L;

	// 像普通Java类一样定义属性
	private static int count;

	public static int getCount() {
		return count;
	}

	// 继承自父类的构造方法:无参构造
	public SelfException() {
		super();
	}

	// 继承自父类的构造方法:传参异常信息
	public SelfException(String message) {
		super(System.currentTimeMillis() + " " + message);
		count++;
	}

	// 在某个方法上抛出自定义的异常
	private static void throwSelfException() throws SelfException {
		System.out.println("测试抛出自定义异常,抛出异常实际是抛出一个异常对象,使用new创建的一个异常对象");
		throw new SelfException("抛出了自定义异常");
	}

	// 在另一个方法上捕获和处理自定义的异常
	private static void catchAndHandleSelfException() {
		System.out.println("使用try-catch捕获和处理自定义异常");
		try {
			throwSelfException();
		} catch (SelfException e) {
			// 捕获异常后,可对异常对象进行各种操作,如异常信息打印、异常对象方法调用等
			e.printStackTrace();
			System.out.println("异常数量统计:" + SelfException.getCount());
		}
	}

	public static void main(String[] args) {
		catchAndHandleSelfException();
	}

}

3.异常处理方式
调用者如果调用一个抛出了异常的方法,就要对这个抛出的异常进行处理。调用者可以继续向上抛出这个异常,也可以自己检测和处理这个异常。向上抛出异常只需要在方法后throws theExceptionOfCalled即可,自己检测和处理异常则分为两步:异常的检测由调用者的try代码块去完成,异常的处理则交给调用者的catch代码块完成。具体如下:
注:异常处理机制中,try必须存在,且位于第一位,之后必须跟有catch或finally语句中的至少任意一个。
①try-catch处理异常

try
{可能有异常的语句块}
catch(异常类型 e)
{处理异常//通常是打印异常提示信息,打印堆栈信息}

try正常,则过catch,继续往下;
try不正常,异常匹配catch?进入catch然后继续往下:jvm立刻强制退出并在控制台输出异常报告
②try-catch-finally处理异常

try
{可能有异常的语句块}
catch(异常类型 e)
{处理异常//通常是打印异常提示信息,打印堆栈信息}
finally
{一定要执行的语句}

try正常,则过catch,进入finally,继续往下;
try不正常,异常匹配catch?进入catch,进入finally,继续往下:过catch,进入finally,继续往下

try或catch中可以存在return语句,finally中不能有return,否则会警告。
当try或catch中存在return语句时,finally也是会执行到,执行完finally以后才会返回到try或catch中的return语句,然后退出JVM。仅当try或catch中存在且被读取到System.exit(1)时,直接退出JVM,不再执行任何其余语句,包括finally语句。
③多重catch语句
必须从异常子类到异常父类从小到大排列,因为catch语句从前往后执行且匹配后进入该catch然后跳过所有其它的catch。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值