《java编程思想——第十二章(通过异常处理错误)》

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011067966/article/details/80276715
12.1 概念##

发现错误的理想时机是编译时期,然而,编译期间并不能找出所有的错误,余下的问题必须在运行时期解决。

12.2 基本异常##

异常是指阻止当前方法或作用域继续执行的问题。

当抛出异常后,首先在堆上创建异常对象,当前的执行路径被终止,并从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。

所有标准类异常都有两个构造器:默认构造器,接受字符串的构造器,以便可以传递相关信息。

throw new NullPointerException("空指针异常");
12.3 捕获异常##

如果在方法内部抛出了异常,这个方法将在抛出异常的过程中结束。
如果不希望方法就此结束,可以用try来捕获异常。

try {
	//code
} catch (Exception e1) {
	// TODO: handle exception
}catch (Exception e2) {
	// TODO: handle exception
}

异常处理理论上有两种模型:终止和恢复。

12.4 创建自定义异常##

要自己定义异常类,必须从已有的异常类继承。

/**
 * 自定义异常
 * @author Administrator
 *
 */
class SimpleException extends Exception{}
public class InheritingException {
	public void f() throws SimpleException{
		System.out.println("throw throws from f()");
		throw new SimpleException();
	}
	public static void main(String[] args) {
		InheritingException ex = new InheritingException();
		try {
			ex.f();
		} catch (SimpleException s) {
			System.out.println("Catch it");
		}
	}
}
12.5 异常说明##

Java鼓励把方法可能会抛出的异常告知使用者。

void f() throws Exception{}

代码必须的异常说明保持一致。

12.6 捕获所有异常##

printStackTrace()方法所提供的信息可以通过getStackTrace()方法直接来访问。
这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每个元素都表示栈中一帧。

12.7 Java标准异常##

Throwable可以用来表示任何可以作为异常别抛出的类。
Throwable可分为两种类型:Error用来表示编译时和系统错误;Exception是可以被抛出的基本基本类型。

RuntimeException异常是不需要抛出的,它们被称为不受检查异常“”,由虚拟机处理。

12.8 使用finally子句清理##

对应一些代码,可能希望无论在try块中是否抛出,它们都能得到执行。可以在异常处理后加上finally子句。
finally子句可以把内存之外的资源恢复到它们的初始状态。

因为finally子句总会执行,所以在一个方法中可以多点返回。

/**
 * finally实现多点返回
 * @author Administrator
 *
 */
public class MutipleReturns {

	public static void f(int i) {
		System.out.println("开始");
		try {
			System.out.println("point 1");
			if(i == 1) return;
			System.out.println("point 2");
			if(i == 2) return;
			System.out.println("point 3");
			if(i == 3) return;
			System.out.println("end");
			return;
		} finally{
			System.out.println("结束");
		}
	}
	public static void main(String[] args) {
		for (int i = 0; i < 4; i++) {
			f(i);
		}
	}
}

异常可能会被丢失:

/**
 * 异常丢失
 * @author Administrator
 *
 */
public class ExceptionSilencer {
	public static void main(String[] args) {
		try {
			throw new RuntimeException();
		} finally {
			return;
		}
	}
	
}
12.9 异常的限制##

当覆盖方法时,只能抛出在基类方法的异常说明里列出的异常。
这个限制意味着当基类使用的代码应用到其派生类对象的时候,一样能工作。

12.10 构造器##
12.13 异常使用##

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u011067966/article/details/80276715