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该不该被捕获了!

      

  • 相关阅读:
    软件工程
    python 浮点数四舍六入五成双
    python 比较内嵌字典的值
    python 之多继承顺序及supper()方法执行顺序
    python之装饰器进化
    Centos7 安装Postgres10
    hive常用操作
    MySQL中case when else end 用法
    python写入日志文件时日志内容重复写入
    python向config、ini文件读取写入
  • 原文地址:https://www.cnblogs.com/luguo3000/p/3546539.html
Copyright © 2011-2022 走看看