------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
程序出行错误,是很常见的一个现象,需要我们根据终端console提供的异常输出信息,判断错误的原因。
一. 错误分类
Throwable 是所有 Java 程序中错误处理的父类 ,有两种资类: Error 和 Exception 。
1. Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
2. Exception :表示可恢复的例外,这是可捕捉到的。
二 . Exception异常分类
1. Java自带的异常分类:
分为 运行时异常(RuntimeException)和 检查性异常checked exception(非运行时异常)。
(1)RuntimeException类:
是Exception类的子类,它叫做运行时异常,Java中的所有运行时异常都会直接或者间接地继承自RuntimeException类。
当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run() 抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是 Exception 的子类,也有一般异常的特点,是可以被 Catch 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
(2)检查性异常checked exception:
Java中凡是继承自Exception,而不继承自RuntimeException类的异常都是非运行时异常。我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行catch处理 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。
(3)常见的异常有:
(a) java.lang.NullPointerException(空指针异常):调用了未经初始化的对象或者是不存在的对象
(b) java.lang.ClassNotFoundException: 指定的类不存在
(c) java.lang.NumberFormatException:字符串转换为数字异常
(d) java.lang.IndexOutOfBoundsException:数组下标越界异常
(e)java.lang.IllegalArgumentException:方法的参数错误
(f) java.lang.IllegalAccessException:没有访问权限
(g) java.lang.ArithmeticException:数学运算异常
(h) java.lang.ClassCastException: 数据类型转换异常
(i) java.lang.FileNotFoundException:文件未找到异常
(j)java.lang.ArrayStoreException:数组存储异常
(k) java.lang.OutOfMemoryException:内存不足错误
(l)java.lang.NoClassDefFoundException:未找到类定义错误
2. 自定义异常
自定义异常,通常就是定义一个类,去继承Exception类或者它的子类。
二. Java异常处理代码(一般用于检查性异常exception)
对于检查性异常exception,也就是非运行时异常,必须处理,否则无法通过编译。异常处理一般有以下两种。
1. 用try...catch语句来处理
try
{
// 可能发生异常的代码
// 如果发生了异常,那么异常之后的代码都不会被执行
}
catch (Exception e)
{
// 异常处理代码
}
.....此处可以有多个catch语句,分别处理不同的异常
finally
{
// 不管有没有发生异常,finally语句块都会被执行
}
2. 在产生异常的方法声明后面写上throws 某一个Exception类型 如throws Exception,将异常抛出到外面一层去,也就是调用此方法的那个方法来处理。