【问题标题】:Exception other than RuntimeExceptionRuntimeException 以外的异常
【发布时间】:2023-03-23 00:43:01
【问题描述】:

Java 中除了 RuntimeException 之外,还有可能发生异常吗?谢谢。

【问题讨论】:

    标签: java exception


    【解决方案1】:

    是的,有三种

    已检查的异常

    编译器会通知您何时可以抛出它们,因为最有可能是环境中的故障​​。

    他们应该被抓住,如果程序可以用它做点什么,否则最好放他们走。

    大部分继承自

    java.lang.Exception
    

    或来自

    java.lang.Throwable
    

    虽然从前者继承更好。

    例如:

    java.io.IOException
    

    表示发生了某种 I/O 异常。此类是由失败或中断的 I/O 操作产生的一般异常类。

    错误

    这些是特殊类型的异常。他们不应该被抓住,因为当他们发生时,意味着刚刚发生了非常非常糟糕的事情。

    它们都继承自

    java.lang.Error
    

    例如:

    java.lang.OutOfMemoryError
    

    当 Java 虚拟机因为内存不足而无法分配对象时引发,并且垃圾收集器无法提供更多内存。

    java.lang.StackOverflowError
    

    由于应用程序递归太深而发生堆栈溢出时引发。

    运行时异常

    用于识别程序员故障,而不是资源故障。

    在编码时“通常”可以避免运行时异常。如果你有一个很可能你做错了什么。

    有时会捕获运行时异常,但是,除非您确切知道自己在做什么以及为什么,否则捕获它们是一种不好的做法(同样,除非这正是您所需要的)

    他们继承自

    java.lang.RuntimeException 
    

    例如

    java.lang.ArrayIndexOutOfBoundsException
    

    抛出以指示使用非法索引访问了数组。索引为负数或大于等于数组的大小

    java.lang.NullPointerException
    

    当应用程序在需要对象的情况下尝试使用 null 时引发

    关于最后两个,MOST的时候,可以通过仔细编程来避免,了解程序的状态是什么(这个数组有5个元素吗?我为什么要尝试访问-1 或 6。这个引用是空的吗?我为什么要调用 null.toString())

    尽管我曾与声称应该抓住所有 NPE 的人发生争执。好吧,我能说什么。

    【讨论】:

    • 这是这里最好的答案,除了过去的“catch”意义是“caught”,而不是“catched”。
    • @MetroidFan2002: 捕获语法异常我的意思是捕获:) (我应该认真对待谷歌检查拼写红色下划线)
    • @mmyers:那是因为它们最糟糕;)我本可以等待您的编辑并在此过程中修复“捕获/捕获”。出于某种原因,我不好意思解释,我花了 15 分钟并重新启动机器来进行更正。错误代码:PEBKAC
    【解决方案2】:

    java.lang 包定义了以下非运行时异常的标准异常类:

    • ClassNotFoundException:抛出此异常表示找不到要加载的类。

    • CloneNotSupportedException:当为未实现 Cloneable 接口且无法克隆的对象调用 clone() 方法时,将引发此异常。

    • Exception:此异常的相应子类被抛出以响应在虚拟机级别检测到的错误。如果一个程序定义了自己的异常类,它们应该是异常类的子类。

    • IllegalAccessException:当程序试图动态加载一个类(即使用 Class 类的 forName() 方法,或者 findSystemClass() 或ClassLoader 类的 loadClass() 方法)并且当前执行的方法无权访问指定的类,因为它在另一个包中并且不是公共的。当程序尝试创建一个类的实例(即使用 Class 类的 newInstance() 方法)时,也会引发此异常,而该类的实例没有可供调用者访问的零参数构造函数。

      李>
    • InstantiationException:在尝试使用 Class 类的 newInstance() 方法实例化抽象类或接口时抛出此异常。

    • InterruptedException:抛出此异常表示正在休眠、等待或以其他方式暂停的线程已被另一个线程中断。

    • NoSuchFieldException:找不到指定变量时抛出此异常。此异常是 Java 1.1 中的新异常。

    • NoSuchMethodException:找不到指定方法时抛出此异常。

    【讨论】:

    • 这几乎不是“Java 中除 RuntimeException 之外发生的异常”的完整列表。每个扩展 java.lang.Exception(或子类)但不扩展 java.lang.RuntimeException(或子类)的类都是有效的异常类(前提是此类存在并且至少在某处至少使用一次 :))。
    【解决方案3】:

    基本上在 java(与 .NET 相对)中,您有两种类型的异常:

    • Checked Exception:所有继承自异常的类。客户端代码必须通过 try-catch 或 throws 子句处理此类异常(在编译器中强制执行)。
    • 未经检查的异常:从 RuntimeException 继承的所有类。客户端代码不必处理此类异常。

    我可以建议以下O'Reilly On Java Exception 文章。

    【讨论】:

    • 他们是三个而不是两个。看我的回答。
    • Java 和 Spec# 已检查异常,并且可以以某种形式在 .NET 上运行。
    • 来吧伙伴!错误是一种运行时异常,因为它不需要在 throws 子句中捕获。阅读关于 Java 的文章。
    • 你在两个意义上都错了。 Error 是 Throwable 的一种类型,因为它扩展了它。此外,由于 Error 不是要被捕获的,它也不是 RuntimeException 类型,因为某些 RuntimeExceptions(即 NumberFormatException)有时是要被捕获和处理的。
    • @Igor: je je .. 我不是指类层次结构中的异常,而是作为一个整体的概念。 Saludos compa!
    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2013-08-30
    • 2015-05-25
    相关资源
    最近更新 更多