异常机制
a、异常及错误:
Throwable
Error
AWTError
IOError
LinkageError
ThreadDeath
Exception
SQLException
IOException
RuntimeException
IndexOutOfBoundsException
NullPointerException
ClassCastException
b、Throwable:
有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
c、Error:
系统或虚拟机的异常,无法捕获。如:OutOfMemoryError
d、Exception:
程序本身可以处理的异常。
RuntimeException:JVM 常用操作引发的异常,如:NullPointerException
e、Checked:
在编译期间就可以发现的异常,必须在运行之前就进行处理的异常。
除了RuntimeException及其子类以外,
其他的Exception类及其子类都属于可查异常。
这种异常的特点是Java编译器会检查它,也就是说,
当程序中可能出现这类异常,要么用try-catch语句捕获它,
要么用throws子句声明抛出它,否则编译不会通过。
f、Unchecked:
包括运行时异常(RuntimeException与其子类)和错误(Error)。
g、运行时异常:
运行时异常的特点是Java编译器不会检查它,
也就是说,当程序中可能出现这类异常,
即使没有用try-catch语句捕获它,
也没有用throws子句声明抛出它,也会编译通过。
h、编译异常:
是RuntimeException以外的异常,
类型上都属于Exception类及其子类。
从程序语法角度讲是必须进行处理的异常,
如果不处理,程序就不能编译通过。
如IOException、SQLException等以及用户自定义的Exception异常,
一般情况下不自定义检查异常。
异常处理:
a、抛出异常:
一个方法出现错误引发异常时,
方法创建异常对象并交付运行时系统,
异常对象中包含了异常类型和异常出现时的程序状态等异常信息。
运行时系统负责寻找处置异常的代码并执行。
throws:如果一个方法可能会出现异常,但没有能力处理这种异常,
可以在方法声明处用throws子句来声明抛出异常。多个异常可使用逗号分割
throw:异常必须在方法内抛出。
b、捕获异常:
try...catch...finally...
Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error。
try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
catch 块:用于处理try捕获到的异常。
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。
当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。
package main;
public class CoreJavaDay12_2 {
static String a = null;
public static void main(String[] args) {
try {
String aString = null;
String bb = aString.toLowerCase();
}catch (NullPointerException e) {
System.out.println("空指针了");
StackTraceElement [] ste = e.getStackTrace();
System.out.println(ste[0].getLineNumber());
e.printStackTrace();
}catch (Exception e) {
}finally{
System.out.println("执行了finally");
}
// try {
// String a = null;
// a = a.toLowerCase();
// int c = b[3];
// }finally{
// System.out.println("hahaha");
// }
}
public static void doSomething(){
int []b = new int[3];
a = a.toLowerCase();
int c = b[3];
}
}
在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。
getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。
getMeage():返回异常的消息信息。
printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。
ClassCastException 类型转换异常类
ArrayStoreException 数组中包含不兼容的值抛出的异常
SQLException 操作数据库异常类
NoSuchFieldException 字段未找到异常
NoSuchMethodException 方法未找到抛出的异常
NumberFormatException 字符串转换为数字抛出的异常
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
IllegalAccessException 不允许访问某类异常
InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常