【岁月留声(Java)】main方法不应该直接throws Exception

分析

为什么说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);
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kida 的技术小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值