V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hqtc
V2EX  ›  Java

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

  •  
  •   hqtc · 2017-10-28 15:26:42 +08:00 · 4836 次点击
    这是一个创建于 2582 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目中使用 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 了吗?

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

    举几个例子:

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

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

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

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

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

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

    至少捕获打个日志啊
    esmdxx1
        12
    esmdxx1  
       2017-10-29 09:48:15 +08:00 via iPhone
    @GuuJiang
    @hqtc
    @haozhang
    @skydiver
    @zhx1991
    你们不查百度,知道品牌和商标区别吗?
    shibingsw
        13
    shibingsw  
       2017-10-29 10:44:57 +08:00
    多半是你的代码有 bug。
    skydiver
        14
    skydiver  
       2017-10-29 14:05:49 +08:00 via Android
    @esmdxx1 串线了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:18 · PVG 17:18 · LAX 01:18 · JFK 04:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.