zoukankan      html  css  js  c++  java
  • java中的error该不该捕获

      写java程序时,通常会被提示捕获异常,而又有一些异常是不需要强制捕获的,这是一个被说烂了的话题。像我一样从其他语言转过来的人确实有点迷惑,那我以我的理解重新解释一遍吧。

      异常的基类是Exception,Exception子类有RuntimeException和其它Exception。这些其它的Exception叫做Checked异常,RuntimeException叫做Unchecked异常。

      只看名字不太好理解,说的通俗点,java为了程序能够稳定的运行,就提示开发者捕获已知异常。编译器知道所有类型或方法可能抛出的异常,在你使用某种类型或方法时,编译器就会提示你捕获已知的异常。这些编译器已知的可能存在的异常就是Checked异常。例如你在关闭文件流时,IOException已经在close方法里写明可能抛出,那么编译器就提示你必须捕获异常。而RuntimeException异常在编译阶段是不知道的,只有运行阶段才能确定,比如3/0(3除以0)会报ArithmeticException异常。因为这个除数是运行阶段可以变化的,所以不提示捕获。这些RuntimeException就是Unchecked异常。

      总之java是尽可能的让程序稳定,知道的就提示你,不知道的就无能为力了。这样解释应该比较清晰了吧。

      下边要进入正题了。

      可能有些朋友在调试程序时遇到过这种情况,程序明明出现了异常,也catch(Exception e)了,却没有捕获到任何信息。原因无非有两个,1.异常所在的线程跟你捕获的线程不是同一个线程,2.程序抛出的不是Exception而是Error。Error跟Exception一样都继承自Throwable,是指不应该被捕获的严重错误。当时看到这个解释,我竟然傻逼到没想明白为什么不该捕获Error。因为出现Error的情况会造成程序直接无法运行,所以捕获了也没有任何意义。那我的问题又来了,如果不捕获,那程序出问题退出了,连log都看不见,我该怎么办?其实这个假设是不成立的,因为如果Error真的存在,你在开发环境就已经发现问题了,根本不可能发布到正式环境。

      唉,绕了一大圈搞了这么件傻逼事,所以不要再讨论Error该不该被捕获了!

      

  • 相关阅读:
    <2014 04 29> *nix环境编程常用库总结
    <2014 04 29> c/c++常用库总结
    <2014 04 26> 《Coders at Work编程人生:15位软件先驱访谈录》
    <2014 04 16> 上班实习第一天
    <2014 04 15> C++语言回顾精要(原创By Andrew)
    [荐][转]为何应该使用 MacOS X(论GUI环境下开发人员对软件的配置与重用)
    [荐][转]王垠:我和权威的故事(2014)
    [荐][转]如何用美剧真正提升你的英语水平
    [转] 数学的用处(一)(二)(三)(四)(数学图谱)
    metadata 和 routing
  • 原文地址:https://www.cnblogs.com/luguo3000/p/3546539.html
Copyright © 2011-2022 走看看