除了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时抛出
关于最后两个,大多数时候,可以通过仔细编程并了解程序的状态来避免它们(这个数组有5个元素吗?为什么我应该尝试访问-1或6个.这个引用是否为null?我为什么要调用null.toString())
虽然我和那些声称应该抓住所有NPE的人争论不休.那么我能说什么呢.
java.lang包定义了以下不是运行时异常的标准异常类:
ClassNotFoundException:抛出此异常以指示无法找到要加载的类.
CloneNotSupportedException:当为未实现Cloneable接口且因此无法克隆的对象调用clone()方法时,抛出此异常.
异常:抛出此异常的相应子类以响应在虚拟机级别检测到的错误.如果程序定义了自己的异常类,它们应该是Exception类的子类.
IllegalAccessException:当程序试图动态加载类时(即,使用Class类的forName()方法,或ClassLoader类的findSystemClass()或loadClass()方法)和当前正在执行的方法,抛出此异常无权访问指定的类,因为它在另一个包中而不是公共的.当程序尝试创建类的实例(即,使用Class类的newInstance()方法)时,也会抛出此异常,该类没有调用方可访问的零参数构造函数.
InstantiationException:抛出此异常是为了响应尝试使用Class类的newInstance()方法实例化抽象类或接口.
InterruptedException:抛出此异常以表示正在休眠,等待或以其他方式暂停的线程已被另一个线程中断.
NoSuchFieldException:无法找到指定的变量时抛出此异常.此异常是Java 1.1中的新增内容.
NoSuchMethodException:无法找到指定的方法时抛出此异常.