除RuntimeException之外的异常

时间:2009-01-20 18:32:45

标签: java exception

除了Java中的RuntimeException之外,是否还有可能发生异常?感谢。

3 个答案:

答案 0 :(得分:12)

是的,有三种种类。

已检查的例外情况

由于环境中的故障​​,编译器会告诉您何时可能抛出它们。

如果程序可以使用它,它们应该被捕获,否则最好让它们离开。

他们中的大多数都是从

继承的
java.lang.Exception

或来自

java.lang.Throwable

虽然从前者继承是更好的。

例如:

java.io.IOException

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

错误

这些是特殊类型的例外。他们不应该被解决因为它们发生时意味着真正发生的事情真的很糟糕。

所有这些都继承自

java.lang.Error

例如:

java.lang.OutOfMemoryError

当Java虚拟机因内存不足而无法分配对象时抛出,垃圾收集器不再提供更多内存。

java.lang.StackOverflowError

因堆栈溢出而导致堆栈溢出时抛出。

RuntimeExceptions

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

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

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

他们继承自

java.lang.RuntimeException 

例如

java.lang.ArrayIndexOutOfBoundsException

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

java.lang.NullPointerException

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

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

虽然我和那些声称应该抓住所有NPE的家伙有争执。那么我能说什么呢。

答案 1 :(得分:6)

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

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

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

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

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

  • InstantiationException :抛出此异常是为了响应尝试使用Class类的newInstance()方法实例化抽象类或接口。

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

  • NoSuchFieldException :无法找到指定的变量时抛出此异常。此异常是Java 1.1中的新增内容。

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

答案 2 :(得分:2)

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

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

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