代码之家  ›  专栏  ›  技术社区  ›  GuruKulki

如何识别Java中的检查和未检查异常?

  •  11
  • GuruKulki  · 技术社区  · 15 年前

    在阅读有关异常的内容时,我总会遇到检查异常和未检查异常,所以想知道如何区分哪些是什么?

    编辑:我想知道我是否创建了任何异常类,那么我如何创建一个选中或未选中的异常类?

    它们的意义是什么?

    5 回复  |  直到 7 年前
        1
  •  17
  •   L. Cornelius Dol    10 年前

    所有 Throwable S除了 java.lang.RuntimeException java.lang.Error 已经检查过了。正确地,在Java中,“异常”是子类。 java.lang.Exception ,“错误”是 java.lang.error错误 java.lang.Throwable 通常不是直接的子类。

    程序不应该创建自己的 Error 子类(尽管文档对此很含糊),所以通常您总是创建 Exceptions ,使用 RuntimeException 如果你不想检查的话。

    在运行时知道是否检查了 例外 您可以使用:

    if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
        // this is a checked Exception
        }
    

    检查异常是必须在catch子句中处理的异常,或声明为在方法签名中引发的异常;编译器强制执行此异常。通常,对于应该由调用代码处理的异常,使用checked异常;而unchecked异常是针对由编程错误导致的情况,应该通过更正代码来修复。

    也就是说,在Java社区中,到处都在讨论使用检查异常与未检查异常的有效性,这是在这个答案中深入讨论的一种主题方式。

    编辑2012-10-23: 作为对评论的回应(这些评论是非常有效的),为了澄清,需要以下内容来确定是否捕获了 可抛出 是检查过的 可抛出 与支票相反 Exception :

    if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) {
        // this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error
        }
    

    如果问题的对象是 已知的 成为 可抛出 (例如,它被捕获了),只需要上述“if”的第二部分(例如,对可丢弃物的测试是多余的)。

        2
  •  4
  •   Christoph    15 年前

    Java Language Spec, chapter 11 :

    未检查的异常类是 RuntimeException 它的子类和类 Error 以及它的子类。所有其他异常类都被检查为异常类。Java API定义了许多异常类,都是检查和未检查的。附加的异常类,无论是选中的还是未选中的,都可以由程序员声明。

    你可以通过 instanceof 在运行时,虽然我不知道这在哪里有用。

    关于你问题的第二部分:

    • 选中的异常表示预期的错误条件,在正常程序执行期间可能发生,因此必须始终以编程方式处理(编译器强制执行)

    • 未选中的异常表示意外的错误条件,并表示由于无效输入、错误或运行时限制(如内存)而导致的程序异常状态;编译器不会强制程序员处理这些情况,即只有在知道它们发生时才需要处理它们。

        3
  •  1
  •   roottraveller    7 年前

    如果异常类是 RuntimeException ,它不被检查,也不必为函数声明或捕获等。 Error 也不必声明/捕获异常。你就是这么问的吗?

        4
  •  0
  •   Derek Mortimer    15 年前

    很肯定这是以前问过和回答过的问题,但为了这个原因,这里很好地涵盖了这一点: http://www.javapractices.com/topic/TopicAction.do?Id=129 .

    严格地说,未经检查的异常总是会扩展 RuntimeException 而选中的异常则没有。上述链接解释了何时使用这两种方法。

    正如他们的名字所表明的,打电话的人必须处理 选中的 异常,通常处理它们( try/catch )或者把它们往上扔。未经检查的异常通常被认为是由调用方控制之外的元素引起的。

        5
  •  -2
  •   Ravi Kiran Lanka    11 年前
    package practice;
    
    import java.io.IOException;
    
    class Practice
    {
        public static void main(String args[])
        {
            Exception n=new NullPointerException();
            if(n instanceof RuntimeException)
            {
                System.out.println("this is a runtime(unchecked) exception");
            }
            else
            {
                System.out.println("this is not a compiletime(checked) exception");
            }
    
        }
    
    }