`

第十二章 通过异常处理错误

 
阅读更多
异常参数

throw new NullPointerException("t = null");

关键字throw将触发许多十分奇妙的事情。通常,你首先使用new来创建对象,用以表示错误情况,此对象的引用将传给throw。尽管返回的异常对象其类型通常与方法设计的返回类型不同,但从效果上看,它就像是从方法“返回”的。
此外,你能抛出任意类型的Throwable(它是异常类型的根类)对象。

栈轨迹
public class WhoCalled {
	static void f() {
		try {
			throw new Exception();
		} catch (Exception e) {
			for (StackTraceElement ste : e.getStackTrace()) {
				System.out.println(ste.getMethodName());
			}
		}
	}
	static void g() {
		f();
	}
	static void h() {
		g();
	}
	public static void main(String[] args) {
		f();
		System.out.println("--------------------------");
		g();
		System.out.println("--------------------------");
		h();
	}
}
Output :
f
main
--------------------------
f
g
main
--------------------------
f
g
h
main


重新抛出异常

如果你只是把当前异常对象重新抛出,那么printStackTrace( )方法显示的将是原来异常抛出点的调用栈信息,而并非重新抛出点的信息。要想更新这个信息,你可以调用fillInStackTrace( )方法,这将返回一个Throwable对象,它是通过把当前调用栈信息填入原来那个异常对象而建立的。

你有可能会在捕获异常之后抛出另一种异常。这么做的话,将得到类似使用fillInStackTrace( )的效果,有关原来异常发生地点的信息会丢失,剩下的是与新的抛出地点有关的信息:

最后那个异常仅知道自己来自main(),而对f()一无所知。

你永远不用为清理前一个异常对象而担心,或者说为异常对象的清理担心。它们都是用new在堆上创建的对象,所以垃圾回收器会自动把它们清理掉。

java标准异常

所以Java程序员关心的主要是Exception。
异常的基本的概念是用名称代表发生的问题,并且异常的名称应该可以望文知意。

特例RuntimeException

属于运行期异常的类型有很多。它们会自动被Java虚拟机抛出,所以你不必在异常说明中把它们列出来。这些异常都是从RuntimeException类继承而来,所以既体现了继承的优点,使用起来也很方便。
RuntimeException类型的异常也许会穿越所有的执行路径直达main( )方法,而不会被捕获。要明白到底发生了什么,可以试试下面的例子:
import com.bruceeckel.simpletest.*; 
public class NeverCaught { 
private static Test monitor = new Test(); 
static void f() { 
throw new RuntimeException("From f()"); 
} 
static void g() { 
f(); 
} 
public static void main(String[] args) { 
g(); 
monitor.expect(new String[] { 
"Exception in thread \"main\" " + 
"java.lang.RuntimeException: From f()", 
" at NeverCaught.f(NeverCaught.java:7)", 
" at NeverCaught.g(NeverCaught.java:10)", 
" at NeverCaught.main(NeverCaught.java:13)" 
}); 
} 
} ///:~

所以答案是:如果RuntimeException没有被捕获而直达main( ),那么在程序退出前将调用异常的printStackTrace( )方法。

请务必记住:你只能在代码中忽略RuntimeException(及其子类)类型的异常,其它类型异常的处理都是由编译器强制实施的。究其原因,RuntimeException代表的是编程错误:

1.你无法预料的错误。比如从你控制范围之外传递进来的null引用。
2.作为程序员,你应该在代码中进行检查的错误。(比如对于ArrayIndexOutOfBoundsException,你就得注意一下数组的大小了。)在一个地方发生的异常,常常会在另一个地方导致错误。

异常的限制

    当你重载方法的时候,你只能抛出在父类方法的异常说明里列出的那些异常。这个限制很有用,因为这样的话,对父类能工作的代码应用到子类对象的时候,一样能够工作(当然,这是面向对象的基本概念),异常也不例外。
异常限制对构造器不起作用。派生类构造器的异常说明必须包含基类构造器的异常说明。注意,派生类构造器不能捕获基类构造器抛出的异常。

异常使用指南

你应该在下列情况下使用异常:

1.在恰当的级别处理问题。(在你知道该如何处理的情况下才捕获异常)。
2.解决问题并且重新调用产生异常的方法。
3.进行少许修补,然后绕过异常发生的地方继续执行。
4.用别的数据进行计算,以代替方法返回的期望值。
5.把当前运行环境下能做的事情尽量作完,然后把相同的异常重抛(rethrow)到更高层。
6.把当前运行环境下能做的事情尽量作完,然后把不同的异常抛(throw)到更高层。
7.终止程序。
8.进行简化。(如果异常把问题搞得太复杂,那用起来会非常痛苦也很烦人。)
9.让类库和程序更安全。(这既是在为调试做短期投资,也是在为程序的健壮性做长期投资。)
分享到:
评论

相关推荐

    第十二章 通过异常处理错误

    本章将深入探讨如何通过异常处理来有效地管理程序中的错误。异常处理是一种在出现异常情况时中断正常流程并执行特定恢复策略的技术。在Java、Python、C++等众多编程语言中,异常处理都扮演着关键角色。 首先,我们...

    Java编程思想第十二章通过异常处理错误.pptx

    Java编程思想第十二章通过异常处理错误.pptx

    精品课件 Python从入门到精通 第12章 异常处理及程序调试(共10页).ppt

    本课件的第12章主要关注如何处理这些异常以及如何进行程序调试,以确保代码能够正确执行。 异常处理在Python中通过使用`try-except`语句来实现。当`try`块中的代码出现异常时,程序会立即跳转到相应的`except`块中...

    Java语言程序设计基础第十版第十二章课后复习题答案

    根据提供的信息,我们可以总结出以下关于《Java语言程序设计基础第十版》第十二章的一些关键知识点及解答: ### 一、异常处理基本概念 #### 12.1 **问题:** 异常处理的主要思想是什么? **解答:** 异常处理的主要...

    第12章 错误调试和异常处理.ppt

    C#入门ppt,一共16章

    大数据分析与挖掘课程 数据挖掘(第三版)教程 纯英文原版PPT课件 第12章 Outlier-异常处理 共56页.pptx

    总之,《数据挖掘:概念与技术》(第三版)第12章深入介绍了异常处理的相关理论和技术,并提供了丰富的案例研究。通过对异常处理的学习,可以更好地理解如何从复杂多变的数据集中发现有价值的信息,这对于提高数据...

    第12章 python文件存取和异常处理-python基础,快速入门.pptx

    在Python中,文件存取是编程中常见的操作,它涉及文件的读取、写入以及异常处理。本章主要讲解了如何使用Python进行文件操作。 1. **文件读取** - 使用`open()`函数打开文件,例如`open('work\readme.txt')`。在...

    完整版 Java开发实训课程系列-SpringMVC框架技术教程 第6章 异常处理 (共12页).pptx

    **SpringMVC框架中的异常处理**是Java开发中不可或缺的一部分,它确保了应用程序在遇到错误时能够优雅地处理并提供有用的反馈。在SpringMVC框架中,异常处理机制允许开发者集中处理可能出现的各种异常,提高代码的可...

    Java编程思想笔记(全)

    #### 第 12 章 通过异常处理错误 第十二章讲解了Java中的异常处理机制。异常处理是处理程序运行时错误的有效方式。本章首先介绍了异常的概念,然后详细讨论了如何使用try-catch-finally语句来捕获和处理异常,以及...

    编程思想下篇

    由于上传文件大小限制...第12章 通过异常处理错误 第13章 字符串 第14章 类型信息 第15章 泛型 第16章 数组 第17章 容器深入研究 第18章 Java I/O系统 第19章 枚举类型 第20章 注解 第21章 并发 第22章 图形化用户界面

    Thinking in java4(中文高清版)-java的'圣经'

    非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章 多态 第9章 接口 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第...

    c++primer第五版习题答案(第12章)

    通过解决这些习题,学生可以加深对C++语言特性的理解,包括类和对象、动态内存管理、模板、异常处理、标准模板库(STL)等。 在实际使用这些习题答案时,建议读者首先尝试独立完成习题,遇到问题后再参照答案进行核对...

    05_第5章 异常1

    在Java编程中,异常处理...通过正确使用异常处理,开发者可以更有效地定位和解决程序中的错误,提高程序的稳定性和用户体验。同时,自定义异常允许开发者根据项目需求创建特定的异常类型,使代码更具可读性和可维护性。

    jsp程序开发范例宝典 第十二章

    《JSP程序开发范例宝典》第十二章聚焦于JSP(Java Server Pages)的高级应用和实战技巧。在这一章中,我们通常会深入探讨以下关键知识点: 1. **自定义标签库(Custom Tags)**:JSP 2.0引入了自定义标签库的概念,...

    GD32-STM32-CH32芯片内核ARM Cortex-M3与Cortex-M4权威指南(中文)

    第十二章 错误异常和错误处理 第十三章 浮点运算 第十四章 调试和跟踪测试 第十五章 Keil ARM 微控制器开发套件入门 第十六章 IAR Embedded Workbench for ARM 入门 第十七章 GCC 入门 第十八章 输入和输出软件实例 ...

    java开发实战经典第十二章课后习题答案

    《Java开发实战经典》是许多Java初学者的重要学习资料,其第十二章涵盖了诸多关键知识点。这章可能涉及了面向对象编程的深入理解、异常处理、集合框架的使用、多线程、网络编程或者IO流等内容。课后习题通常用于巩固...

    北大青鸟S1JAVA第十二章课后练习详解

    在北大青鸟S1JAVA课程的第十二章中,学员们会接触到一系列深入的Java编程概念和实践。这一章节的课后练习旨在巩固所学知识,提升编程技能。以下是本章涉及的一些关键知识点: 1. **面向对象编程基础**:在Java中,...

    Java语言程序设计:第五章 异常.ppt

    本章主要介绍了Java中的异常处理机制及其重要性。 异常是程序运行时遇到的问题,如文件错误、设备故障、逻辑错误等。Java提供了一套完整的异常处理框架,使得开发者可以有效地管理和响应这些异常情况。异常处理的...

    Java语言基础入门教程 Java开发编程基础课程 第12章 内部类和异常处理 共18页.pptx

    异常处理是Java编程中的一个重要概念,它允许程序员在程序运行过程中处理错误情况,避免程序崩溃。 - **基本语法**: ```java try { // 可能抛出异常的代码 } catch (ExceptionType1 e1) { // 处理异常 } ...

Global site tag (gtag.js) - Google Analytics