`
poyunri
  • 浏览: 29502 次
文章分类
社区版块
存档分类
最新评论

11.2 捕获异常

阅读更多

捕获异常必须设置try/catch语句块,最简单的try语句:

	try {
		//code
		//more code
	} catch (ExceptionType e){
		//handler for this type
	}
1、如果在try语句中的任何代码抛出了catch子句中说明的异常类:

1)程序跳过try语句块的其余代码

2)程序执行catch字句中的处理器代码

2、如果try语句块中没有抛出任何异常类则跳过catch子句。

3、如果方法中任何代码抛出了在catch子句中没有声明的异常类型,该方法会立即退出。

public void read(String filename) {
		try {
			InputStream in = new FileInputStream(filename);
			int b;
			while ((b = in.read()) != -1) {
				//process input
			}
		} 
		catch (IOException exception) {
			exception.printStackTrace();
		}
	}

11.2.1捕获多个异常

try {
		//code that might throw exceptions
	}
	catch (MalformedURLException e1) {
		//emergency action for malformed URLs
	}
	catch (UnknownHostException e2) {
		//emergency action for malformed hosts
	}
	catch (IOException e3) {
		//emergency action for all other I/O problems
	}
要想获得对象更多的信息,可以使用:e3.getMessage()

想得到详细的错误信息(如果有的话),使用:e3.getClass().getName()得到异常对象的实际类型


11.2.2再次抛出异常与异常链接

在catch子句中可以抛出一个异常,这样可以改变异常的类型。

下面是捕获异常并再次抛出的基本方法:

	try {
		//access the database
	}
	catch (SQLException e) {
		Throwable se = new ServletException("database error");
		se.initCause(e);
		throw se;
	}
捕获异常后可以用Throwable e = se.getCause();语句得到原始异常。


11.2.3Finally子句

不管是否有异常被捕获,都要执行finally子句中的代码。

下列例子程序将释放所以环境中的图形设备文本:

Graphics g = image.getGraphics();
try {
	//1
	code that might throw exceptions
	//2
}
catch (IOException e){
	//3
	show error dialog
	//4
}

finally {
	//5
	g.dispose();
}
//6
下列三种情况会执行finally子句:

1)代码没有抛出异常;程序执行1、2、5、6

2)抛出一个在catch处捕获的异常;执行1、3、4、5、6

3)抛出一个异常但不是由catch捕获的;执行1、5


try语句中可以只有finally子句没有catch子句,例如:

InputStream in = ...'
try {
	code that might throw exceptions
}
finally {
	in.close();
}
无论try中是否遇到异常,finally子句都被执行。


警告:当finally子句和try语句块中都有return语句时,finally的return值会覆盖掉try的return值。例如:

public static int f(int n) {
	try {
		int r = n * n;
		return r;
	}
	finally {
		if (n == 2)
			return 0;
	}
}
如果调用f(2),try的返回值是4,finally返回值是0,最后结果为0


11.2.4 分析堆栈跟踪元素
例11-1打印递归阶乘的堆栈情况:

package core.stacktracetest_11_1;

import java.util.Scanner;

/**
 * @author vincent
 */
public class StackTraceTest {

    public static int factorial(int n) {
        System.out.println("factorial(" + n + "):");
        
        Throwable t = new Throwable();
        StackTraceElement[] frames = t.getStackTrace();
        for (StackTraceElement f : frames)
            System.out.println(f);

        int r;
        if (n <= 1) r = 1;
        else r = n * factorial(n - 1);
        System.out.println("return" + r);
        return r;
    }

    public static void main(String[] args) {
        @SuppressWarnings("resource")
        Scanner in = new Scanner(System.in);
        System.out.println("Enter n: ");
        int n = in.nextInt();
        factorial(n);
    }
}

分享到:
评论

相关推荐

    C++和面向对象数值计算

    9.3 捕获异常 9.3.1 重抛出 9.3.2 捕获所有异常 9.3.3 处理函数的顺序 9.4 在函数中指定异常 9.5 标准异常 9.6 练习 第10章 容器和算法标准库 10 标准容器 10.1 向量 10.2 链表 10.1.3 ...

    java程序设计教程课件

    7.2 异常的抛出和捕获 7.3 创建自己的异常类 第8章 输入输出 8.1 输入输出概述 8.2 各种输入输出流 8.3 文件随机存取: RandomAccessFile类 第9章 多线程与Applet 9.1.1 线程的概念 9.1.2 线程的控制 9.1.3 线程的...

    TCL培训教程(全)

    10.3使用catch捕获错误 10.4其他异常 11深入TCL 11.1查询数组中的元素 11.2 info命令 11.2.1变量信息 11.2.2过程信息 11.2.3命令信息 11.2.4 TCL的版本和库 11.2.5 命令的执行时间 11.2.6 跟踪变量 11.2.7 命令的...

    Java范例开发大全 (源程序)

     实例47 try…catch…finally捕获异常的实例 67  实例48 try…catch嵌套捕获异常的实例 68  4.4 throws声明异常 69  实例49 throws声明异常实例一 69  实例50 throws声明异常实例二 70  4.5 throw抛出...

    java范例开发大全(pdf&源码)

    实例47 try…catch…finally捕获异常的实例 67 实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51 throw...

    java范例开发大全源代码

     实例47 try…catch…finally捕获异常的实例 67  实例48 try…catch嵌套捕获异常的实例 68  4.4 throws声明异常 69  实例49 throws声明异常实例一 69  实例50 throws声明异常实例二 70  4.5 throw抛...

    java范例开发大全

    实例47 try…catch…finally捕获异常的实例 67 实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51 throw...

    21天学通Java-由浅入深

    60分钟) 217 11.1 异常处理基本介绍 217 11.1.1 try和catch捕获异常 217 11.1.2 try-catch语句使用注意点 218 11.1.3 finally语句的使用 220 11.1.4 再谈异常处理注意点 222 11.2 异常的分类 223 11.2.1 捕获异常 ...

    MLDN魔乐所有javaSE的pdf文档

    10.5.异常的捕获及处理.pdf 11.1.Java常用类库(上).pdf 11.2.多线程.pdf 12.Java常用类库(下).pdf 13.Java IO(上).pdf 14.Java IO(下).pdf 15.Java类集框架.pdf 16.1.Java反射机制.pdf 16.2.枚举.pdf 17.1....

    轻松学C#(图解版)

    11.1.2 未捕获异常的后果 200 11.1.3 常用异常 201 11.1.4 异常处理 201 11.1.5 使用try和catch关键字 201 11.2 处理异常 204 11.2.1 使用异常处理错误 204 11.2.2 使用多条catch语句 205 11.2.3 嵌套try块 206 ...

    Symbian OS C++高效编程

    OS的异常 102.1 异常退出函数 102.2 使用new(ELeave)进行基于堆的内存分配 122.3 构造函数与析构函数 132.4 使用异常退出函数 142.5 用TRAP和TRAPD捕获异常退出 152.6 LeaveScan 202.7 小结 21第3章...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    9.2.2如何就地捕获异常 9.2.3如何捕获多种异常 9.2.4用finally保证安全性 9.3异常的向前抛出 9.3.1为什么要向前抛出 9.3.2如何向前抛出 9.4自定义异常 9.4.1为什么需要自定义异常 9.4.2如何自定义异常 9.5...

Global site tag (gtag.js) - Google Analytics