第Ⅰ部分 入门篇 1
第1章 异常概述 1
1.1 简介 1
目录 1
1.2 异常概念 3
1.3 异常类层次结构 4
1.4 异常的处理或声明选项 5
1.4.1 处理异常:try、catch和finally 5
1.4.2 try-catch-finally的规则 6
1.4.3 声明异常 7
1.4.4 声明异常的规则 7
1.5 可检测异常和非检测异常 7
1.6 异常的API 8
1.7 小结 10
2.2 选择处理或声明 11
第2章 异常处理技术和实践 11
2.1 简介 11
2.3 标准异常处理选项 12
2.3.1 记录异常和相关信息 12
2.3.2 要求用户或应用程序输入信息 14
2.3.3 使用默认或替换数据值 15
2.3.4 将控制传给应用程序的其他部分 16
2.3.5 将异常转化为其他形式 16
2.3.6 忽略问题 17
2.3.7 重试操作 17
2.3.8 采用替换或恢复操作 18
2.3.9 使系统作好停止准备 18
2.4 异常处理注意事项 18
2.5 处理异常时提倡的事项 18
2.6 处理异常时忌讳的事项 19
2.5.4 根据情况将异常转换为业务上下文 19
2.6.1 一般小要忽略异常 19
2.5.1 尽可能地处理异常 19
2.5.2 具体问题具体解决 19
2.5.3 记录可能影响应用程序运行的异常 19
2.6.2 不要使用覆盖式异常处理块 20
2.6.3 一般不要将特定异常转换为更通用的异常 20
2.6.4 不要处理能够避免的异常 21
第3章 高级异常处理概念 22
3.1 简介 22
3.2 自定义异常 22
3.2.1 定义异常类 23
3.2.2 声明方法抛出自定义异常 23
3.2.3 找到故障点,新建异常并加上关键字throw 24
3.3 链表异常 25
3.4 异常的本地化和国际化 26
3.4.2 为不同地区继承ResourceBundle类 27
3.4.1 创建ResourceBundle子类来存储消息 27
3.4.3 创建覆盖getLocalizedMessage的自定义异常类并用ResourceBundle检索消息 28
3.5 子类 30
3.6 接口和抽象类的异常声明 30
3.7 异常栈跟踪 31
3.8 低级异常处理 34
第4章 异常和线程 39
4.1 简介 39
4.2 多线程系统中的异常 40
4.3 同步代码块中的异常 40
4.4 线程活动的异常风险 42
4.5 基于线程的通信的异常 43
4.6 死锁 46
4.7 取消线程 47
第5章 记录和断言 48
5.1 记录API 48
5.1.1 何时使用记录API 48
5.1.2 记录API简介 48
5.1.3 记录API详述 49
5.1.4 标准记录配置 53
5.2 断言 56
5.2.1 使用断言 57
5.2.2 在应用程序中使用断言 57
第Ⅱ部分 异常处理和设计 59
第6章 异常处理和设计 59
6.1 简介 59
6.2 面向对象设计的原理 59
6.2.1 将异常集成到OOD设计以便维护 62
6.2.3 故障模式分析 69
6.2.2 “可维护性设计”的优缺点 69
6.3 小结 70
第7章 Java核心语言中的异常 71
7.1 简介 71
7.2 基本数据类型 71
7.2.1 概述 71
7.2.2 用法 72
7.2.3 常见问题 72
7.2.4 一般建议 74
7.3 Object类和Java中的对象 74
7.3.1 概述 74
7.3.2 潜在问题概述 74
7.4 数组 79
7.4.1 索引 79
7.4.2 数组存储管理 79
7.5 java.lang包中的接口 80
7.4.3 对象输入 80
7.6 String类和StringBuffer类 81
7.6.1 String类 82
7.6.2 StringBuffer类 82
7.7 BigDecimal类和BigInteger类 82
7.8 包装类 83
第8章 集合和I/O 84
8.1 简介 84
8.2 集合架构 84
8.2.1 概述 84
8.2.2 集合架构的注意事项和相关问题 85
8.2.3 集合架构中的异常和错误 89
8.3 I/O API 91
8.4 I/O子类的异常和错误 94
8.4.1 一般问题 94
8.4.2 特定流类型的问题 95
8.5 新I/O API——NIO 100
8.6 NIO API中的异常 101
8.6.1 缓冲区 102
8.6.2 选择器 106
第9章 分布式Java APl 108
9.1 简介 108
9.2 分布式通信的基本原理 108
9.2.1 Java的分布式通信模型 109
9.2.2 分布式JavaAPI的问题 110
9.2.3 Java异常模型 110
9.2.4 分布式通信模型和标准问题 111
9.3 远程方法调用(RMI) 112
9.3.1 基本RMI通信模型 112
9.3.2 RMI的常见问题 113
9.3.3 RMI的异常模型 116
9.4 Java命名和目录接口 121
9.4.1 JNDI的常见问题 122
9.4.2 常见JNDI操作的异常模型 123
9.5 Java数据库连接 125
9.5.1 JDBC中的异常 125
9.5.2 数据库通信技术的通用问题 126
9.5.3 标准JDBC生命期 128
9.6 小结 132
第10章 J2EE 133
10.1 简介 133
10.2 基本J2EE应用程序模型 133
10.2.1 J2EE应用程序模型 135
10.2.2 J2EE中的异常 136
10.3 客户层 136
10.4 Web层 137
10.4.1 声明性错误处理 138
10.4.2 Web层中的组件 139
10.4.3 Servlet和Filter的异常模型:编程错误处理 140
10.4.4 Servlet和Filter异常模型 140
10.4.5 Servlet组件的常见问题和风险 142
10.4.6 JSP的异常模型 144
10.4.7 JSP的直接错误转发 144
10.4.8 JSP异常模型 145
10.4.9 JSP的转换和运行时错误 146
10.4.10 自定义标记库 146
10.5 EJB层 147
10.5.1 标准EJB方法 147
10.5.2 EJB的常见问题 149
10.5.3 bean特有的问题 150
10.5.4 EJB异常模型 152
10.5.5 客户端调用方法的生命期管理 153
10.5.6 容器回调方法 155
10.5.7 从容器看异常 156
10.6 J2EE和EJB的事务 157
10.7 J2EE和异常处理的全局考虑事项 160
10.8 J2EE异常处理要考虑的因素 161
10.8.1 日志记录 161
10.8.2 异常开销 161
10.8.3 网络层的延迟 163
10.8.4 J2EE系统其他的最佳实践 163
第Ⅲ部分 有效使用异常、错误和处理 165
第11章 体系结构、设计和异常模型 165
11.1 简介 165
11.2.1 故障的代价 166
11.2.2 成功的收获 166
11.2 架构师必须考虑异常和错误 166
11.3 体系结构、设计和开发 167
11.3.1 架构师和设计师的分工 167
11.3.2 开发人员的角色 168
11.4 异常模型的关键体系结构决策 168
11.5 异常模型的体系结构决策 169
11.5.1 处理和传播策略 170
11.5.2 异常和错误类模型 171
11.5.3 常用服务 173
11.6 编写健壮的Java代码 174
第12章 模式 176
12.1 简介 176
12.2 体系结构模式 177
12.2.1 层 177
12.2.2 模型-视图-控制器 178
12.4.1 创建器 179
12.4 创建模式 179
12.3 设计模式 179
12.4.2 Singleton模式 181
12.5 结构模式 182
12.5.1 适配器 182
12.5.2 复合模式 183
12.5.3 facade模式 184
12.5.4 代理模式 185
12.6 行为模式 187
12.6.1 职责链 187
12.6.2 命令模式 188
12.6.3 观察者模式 188
12.6.4 状态模式 189
12.6.5 策略模式 190
12.7 J2EE模式 191
12.8 集成层 192
12.9 表示层 194
12.9.1 Front Controller 194
12.9.2 Intercepting Filter 195
12.10 业务层 196
12.10.1 Service Locator 196
12.10.2 Session Facade 197
12.11 小结 198
第13章 测试 199
13.1 测试的目的和意义 199
13.2 对测试的一些误解 199
13.2.1 误解一:开发人员不应该测试代码 200
13.2.2 误解二:开发人员应完成代码的所有测试 200
13.2.3 误解三:仅用一种方式测试应用程序 200
13.3 盒外和盒内测试类型 201
13.3.1 测试类型 201
13.2.4 误解四:完全测试应用程序 201
13.3.2 测试的角色和职责 203
13.4 Java的测试难点 204
13.5 测试实践 204
13.5.1 测试制度化 204
13.5.2 测试的组织方法 207
13.6 如何管理和运行测试 210
13.7 测试何时结束 212
13.7.1 般测试标准 212
13.7.2 开发人员测试标准 213
第14章 调试 214
14.1 简介 214
14.2 调试的含义 214
14.3 调试原理和实践 215
14.4 调试策略 216
14.5 调试所见和方法 219
14.5.1 低级测试技术 220
14.5.2 中级测试技术 222
14.5.3 高级测试技术 223
14.6 调试面临的特殊挑战 224
14.6.1 在Java应用程序中调试非Java技术 224
14.6.2 架构抛出的异常 225
附录A 分析处理.声明的测试结果 226
附录B JUnit简明指南 230
B.1 基本信息 230
B.2 安装JUnit 230
B.3 运行JUnit 230
B.4 JUnit测试架构的体系结构 231
B.5 编写JUnit测试 232
B.6 测试设计的指导原则 238
附录C MyBuggyServlet——组件验证问题 239