代码之家  ›  专栏  ›  技术社区  ›  Omar Kooheji

为什么不显式声明可能在Java中抛出一些内置异常呢?

  •  7
  • Omar Kooheji  · 技术社区  · 15 年前

    我注意到 Integer.parseInt() 您不必用try-catch包围它,也不必声明该方法可能会抛出异常,尽管它“抛出”了 NumberFormatException .

    为什么我不直接抓住 数字格式异常 或者说我的方法抛出了它?

    4 回复  |  直到 15 年前
        1
  •  16
  •   Community T.Woody    7 年前

    因为这是一个“运行时”异常。

    运行时异常 用于识别编程问题(一个好的程序员可以避免),而

    已检查异常 是为了识别环境问题(例如,无论您的程序有多好,服务器都会关闭,这是无法避免的)

    你可以阅读更多关于 them here

    实际上 three kinds of exceptions ,只应处理其中一个(大多数情况下)

        2
  •  7
  •   toolkit    15 年前
             Throwable
             /      \
          Error    Exception
                    /     \
               *checked*  RuntimeException
                                \
                             *unchecked*
    

    Thinking in Java 对于选中与未选中异常的良好解释。

    有些人认为检查异常是一个失败的实验。例如,Spring和Hibernate都使用未检查的异常,并且经常在未检查的版本中包装检查的异常。

        3
  •  6
  •   bobwienholt    15 年前

    NumberFormatException扩展了RuntimeException,您不必显式处理继承自RuntimeException的任何内容。

    其他RuntimeException包括NullPointerException和IndexOutOfBoundsException。这些是程序员可以避免的,并且必须尝试/捕捉这些类型的异常会创建一些相当混乱的代码。

        4
  •  2
  •   Bill K    15 年前

    只是对工具箱答案的一个长评论。

    检查异常是一个问题的原因是它们最终会导致如下代码:

    try {
        Something that throws an exception
    } catch (Exception e) {}
    

    这是最坏的情况。首先,他们没有记录到他们正在捕获异常。这种情况经常发生,而且几乎是由非常愚蠢的检查异常(如thread.sleep())强制执行的,它会抛出必须捕获的InterruptedException,但99%的时间您不在乎是否有一个异常。

    在上面的例子中,如果抛出的不止一个,人们往往只捕获“异常”,这一事实就更加复杂了。这意味着,即使抛出了一个关键的未经检查的异常,它也会被捕获并被忽略,从而几乎不可能找到问题。

    不止一次,我在团队中花了一个人月的时间来寻找以这种方式隐藏的bug。

    这是一个很好的概念,当你加上一个事实,那就是人类是必须负责任地执行它的人时,它就变得可怕了。