Java 库 throw 了运行时异常怎么搞?

2017-10-28 15:26:42 +08:00
 hqtc

项目中使用 sip-servlets-impl-2.0.0.FINAL.jar 出现卡死问题,检查了一下是由于抛出了一个异常没有捕获,问题是这个异常是 Runtime 的:

使用的 jar 里面关键方法大致如下:

org.mobicents.servlet.sip.message.SipServletRequestImpl#createResponse(int, java.lang.String, boolean){

	try {

	...
         if(xx) throw new IllegalStateException("blala");
    ...
    
	}catch (ParseException ex) {
		throw new IllegalArgumentException("Bad status code " + statusCode,
					ex);
	}	

}

然而现在,我能怎么办,必须对这两个运行时异常进行 try catch 了吗?

4667 次点击
所在节点    Java
14 条回复
GuuJiang
2017-10-28 15:49:40 +08:00
为什么要强调“问题是这个异常是 Runtime 的”,莫非你以为运行时异常就不用 /不能捕获?
hqtc
2017-10-28 16:03:59 +08:00
运行时异常不是不建议捕获处理的吗。。。
觉得抛出运行时异常这个行为就很诡异啊,因为外部调用的时候不强制要求捕获处理,外部调用者根本不知道你里面到底抛了几个异常
hqtc
2017-10-28 16:04:11 +08:00
@GuuJiang 运行时异常不是不建议捕获处理的吗。。。
觉得抛出运行时异常这个行为就很诡异啊,因为外部调用的时候不强制要求捕获处理,外部调用者根本不知道你里面到底抛了几个异常
hujianxin
2017-10-28 16:54:19 +08:00
运行时异常,不建议捕获处理,而是建议避免发生运行时异常,出现运行时异常,说明你的输入肯定是不符合库作者的约定的,所以说,如果按照库的要求约定来写代码就不会发生了。

举几个例子:

1. 假如一个方法要求不能输入 null,但是他没法强制你不输入 null,但是可以在方法开头加上判断,如果输入时 null,则抛出运行时异常。

2. java 迭代器运行过程中不允许修改集合内容,但是他没法强制你不修改,但是他在迭代的过程中会判断,如果你修改了,则抛出运行时异常。

3. wait notify 必须用在 synchronized 块中,但是作者没法强制你每次都正确的使用,但是他会判断你的 wait 方法调用是否放入 synchronized 中,如果没有放入,那么会抛出运行时异常。

所以运行时异常,时作者使得程序正常运行的一种约定,你如果不按约定来,那么他会就抛出运行时异常,你按照约定来,那么就没问题
haozhang
2017-10-28 17:27:59 +08:00
异常除了运行时抛出还能在什么时候抛出?外面包一层 try catch。
hqtc
2017-10-28 17:55:33 +08:00
@hujianxin 有道理额,所以感觉还是分析调用方法的数据和参数。。。但是尼玛是多线程的,程序运行了许久只在昨天出现了一下,也没记得是哪个线程给的数据不对。。。难搞
sorra
2017-10-28 19:00:17 +08:00
@hqtc 要不要 catch 的唯一标准是这个异常你要不要处理 /要不要 let it crash
记录错误信息的最好方式是打个 log,打出 stack trace 和线程名 /请求编号、用户 id 等信息,越全越好
hsuan
2017-10-28 19:57:18 +08:00
运行时异常还是不要 catch 的好,一般运行时异常表示出现了无法恢复的严重错误,你就算 catch 了也跑不下去。
skydiver
2017-10-28 20:06:08 +08:00
要么是你写错了,直接改代码修正错误

要么是库的 bug,给他们提 bug report
skydiver
2017-10-28 20:06:49 +08:00
@skydiver 如果确定是库有问题,可以先捕获异常 workaround 一下
zhx1991
2017-10-28 23:42:07 +08:00
运行时异常当然要捕获

很简单的例子, 比如接收到一个 json 串转换为自定义对象, 这个转换要是错误抛出的异常就是运行时异常

至少捕获打个日志啊
esmdxx1
2017-10-29 09:48:15 +08:00
@GuuJiang
@hqtc
@haozhang
@skydiver
@zhx1991
你们不查百度,知道品牌和商标区别吗?
shibingsw
2017-10-29 10:44:57 +08:00
多半是你的代码有 bug。
skydiver
2017-10-29 14:05:49 +08:00
@esmdxx1 串线了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401499

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX