Java语言中所有的错误及异常都继承自Throwable类。只有当对象是此类或其子类的实例时,才能通过JVM或者Java throw语句抛出。有点意思的是其他以able结尾的都是接口,而Throwable确是类(sigh,还好今天仔细研究了下,不然都不知道)......
Throwable有两个子类:Error和Exception
(1).Error:
表示由JVM侦测到的无法预期的错误,这是属于JVM层次的严重错误,导致JVM无法运行,因此这是无法采取任何恢复的操作,顶多只能显示错误信息。
(2).Exception:
异常,属于可恢复可捕捉的例外
Java主要提供的两种异常:Runtime Exception和Checked Exception
(1).Checked Exception:
也就是我们经常遇到的IO异常,以及SQL的异常都是这种异常。对于这种异常,Java编译器要求我们必须强制进行catch。
(2).Runtime Exception:
即运行时异常,是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。RuntimeException
的任何子类都无需在throws
子句中进行声明,及我们可以不对运行时异常做处理。当出现这种异常时由JVM托管,将异常一直往上层抛,直到遇到处理代码。如果没有处理快,到最上层,如果是多线程则由Thread.run()抛出,该线程结束。如果是单线程则被main()抛出,程序结束。即当我们不对运行时异常做处理时,当出现运行时异常时,要么是线程终止,要么是程序终止。
如果我们不想终止,则必须捕获所有的运行时异常,决不让这个线程退出。在出现异常数据时,正确的做法应该是将异常舍弃,同时记录日志,而不应该由于异常数据影响对下面正确数据的处理。
常见Exception及Error
(1)Exception
java.lang包下有:
1.java.lang.ArithmeticException:
当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
2.java.lang.ArrayIndexOutOfBoundsException
用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
3.java.lang.ArrayStoreException
试图将错误类型的对象存储到一个对象数组时抛出的异常。例如,以下代码可生成一个 ArrayStoreException
:
Object x[] = new String[3]; x[0] = new Integer(0);4.java.lang.ClassCastException
当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个 ClassCastException
:
Object x = new Integer(0); System.out.println((String)x);5.java.lang.ClassNotFoundException
当应用程序试图使用以下方法通过字符串名加载类时,抛出该异常:
Class
类中的 forName
方法。 ClassLoader
类中的 findSystemClass
方法。 ClassLoader
类中的 loadClass
方法。 但是没有找到具有指定名称的类的定义。