分析 为什么说main不应该直接抛出异常(注意,这里说的是“不应该”而不是“不能”,main方法是可以直接抛出异常的)?我个人觉得这个事情要两看,对于开发来说在main中抛异常还真
分析
为什么说main不应该直接抛出异常(注意,这里说的是“不应该”而不是“不能”,main方法是可以直接抛出异常的)?我个人觉得这个事情要两看,对于开发来说在main中抛异常还真的比较直观且方便调试。但事实上对于已经在运行的程序来说在main直接抛出异常会导致某些后续处理无法完成。
举个极端一点的例子,假如现在用到比较原始的jdbc连接查询数据。若在这个过程中发生异常并在main函数中直接抛出后结束,数据库连接将无法释放。
这时有的小伙伴会说”这都已经是main方法了,即使不用finally去处理也没有关系吧。反正程序结束后数据库回话也消失了”。的确,程序结束之后数据库会话也就结束了,但万一这个数据库处理过程是一个长事务处理(现象上像卡死但实际上还在运行,只是耗时较长)。这时,就需要手动发送一个断开连接的标识“告知”数据库,不然会话就会挂起直到数据库连接超时才会结束。但一般来说运维人员为了避免“超时时间过短”(著名的“com.MySQL.jdbc.CommunicationsException: The last packet successfully received from the server was xxxx seconds ago.”)异常,在设置数据库参数时将timeout值设得很高。
以至于在过往我们在某些情况下关闭了程序,但是数据库连接没有释放就是这个原因引起的......有点扯远了,因此我个人觉得throws是可以的,但最好在关键的代码中使用try catch来进行处理。
结论
对于以上说到的情况,我的main方法中采用try catch方法捕获异常:
public static void main(String args[]) { try { doSomething(); } catch (Throwable t) { log.error(t); System.exit(1); }}