Java fights bugs: 错误和异常处理

1. 错误和异常

简易的异常类派生关系
Throwable
顾名思义, "可抛出的"类都派生于Throwable

//默认的构造器, 没有异常信息, 但也不是什么都不做
Throwable();

//带异常信息的构造器, 将参数字符串作为该异常的异常信息
Throwable(String message);

//带原因的构造器, 把参数异常作为该异常的原因
Throwable(String message, Throwable cause);

//获取异常信息
String getMessage();

Error
内部错误, 资源耗尽错误
无能为力, 只能通知用户并优雅结束
例:
VirtualMachineError虚拟机错误
LinkageError链接错误

RuntimeException
源代码错误导致的异常, 程序员的问题
例: 错误强转, 数组越界, 空指针访问

IOException
环境, 用户错误导致的异常

ErrorRuntimeException统称为unchecked异常
IOException称为checked异常

2. 异常处理

2.1 创建异常类

该类派生于ExceptionException的某子类
一般包含两个构造器

//默认构造器
OneException() { super(); }

//带详细异常信息的构造器, 内部实现使用super(String)调用Throwable(String)
OneException(...);

2.2 声明异常

异常是方法的第二种退出途径(第一种是返回值).
方法不仅要告诉编译器将要返回什么值, 还要告诉编译器有可能发生什么错误.
在方法首部添加throws ..., 多个异常类之间用逗号隔开.

void function() throws AException, BException;

不要声明unchecked异常(声明unchecked在静态检查上是合法的, 但不符合逻辑), 必须声明所有可能抛出的checked异常. 这些checked异常或由显式的throw语句抛出, 或由调用的方法抛出.

2.3 抛出异常(throw)

  1. 阅读Java API, 寻找合适的异常类; 或自定义异常类
  2. 实例化并抛出 throw new OneException(...);

方法抛出异常后, 方法会立即退出, 并将控制递交给异常处理器

2.4 捕获异常(catch)

一般来说不应该捕获unchecked异常

2.4.1 try(-catch)*块

try{
	//code
	//more code
	//more and more code
}catch(OneException e){
	//handler
}catch(AnotherException e){
	//handler
}......
  1. try中的代码抛出了某catch子句声明的异常:
    跳过try中剩余代码, 对应catch块中代码被执行
  2. try中代码未抛出异常
    不执行任何catch块中的代码
  3. try中代码抛出未被catch子句声明的异常
    相当于抛出异常

2.4.2 try(-catch)*(-finally)?块

try{
	//code
	//more code
	//more and more code
}catch(OneException e){
	//handler
}finally{
	//final code
}
//code code

finally子句被用来处理try有可能还没来得及完成的任务
优先级 finally > return = throw
无论如何 finally里的语句都会被执行, 而finally子句之后的代码是否执行取决于是否有未处理的抛出异常
为避免控制流混乱, finally子句体中不应该含有控制流语句(return, throw, break, continue)

2.4.3 try-with-resource(-catch)*(-finally)?块

try(Resource r = ...; Resource2 r2 = ...){
	//code
	//more code
	//more and more code
}catch(OneException e){
	//handler
}finally{
	//final code
}

try主体使用了一个 / 多个[可关闭]的资源, 且希望在try主体结束后均将其关闭.
[可关闭]的资源指: 该资源类实现了AutoCloseable接口, 该接口有一个方法

void close() throws Exception;

AutoCloseable接口有一子接口Closeable, 其close方法为

void close() throws IOException;

try-with-resource语句避免了嵌套使用try-finally
try-with-resource主体退出时会自动调用资源列表中所有资源的.close()方法
try-with-resource可以有(-catch)*(-finally)?子句, 但这些子句都将在关闭资源后执行

2.5 调用栈轨迹(stack trace)

Throwable实例的.printStacktrace()方法可以查看异常的栈轨迹
Stackwalker实例的.walk()方法可以查看当前执行位置的栈轨迹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值