【发布时间】:2023-03-23 00:43:01
【问题描述】:
Java 中除了 RuntimeException 之外,还有可能发生异常吗?谢谢。
【问题讨论】:
Java 中除了 RuntimeException 之外,还有可能发生异常吗?谢谢。
【问题讨论】:
是的,有三种。
编译器会通知您何时可以抛出它们,因为最有可能是环境中的故障。
他们应该被抓住,如果程序可以用它做点什么,否则最好放他们走。
大部分继承自
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 的人发生争执。好吧,我能说什么。
【讨论】:
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(与 .NET 相对)中,您有两种类型的异常:
我可以建议以下O'Reilly On Java Exception 文章。
【讨论】: