JAVA异常体系
1.error 错误
程序无法处理的异常,
它是由JVM产生和抛出的,比如OutOfMemoryError.ThreadDeath等
示例:
java
public class Test {
public static void main(String[] args) {
run();
}
public static void run(){
run();
}
}
堆栈溢出,这是由于JVM或者是堆栈无法处理导致的异常
2.exception 异常
程序可以处理的异常,
这种异常分为两大类,运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
运行时异常 (非受检异常):
在程序运行期间报出的异常,在运行之前并没有被程序检验出来。
java
public class Test {
public static void main(String[] args) {
int[] arr = new int[5];
int a = arr[10];//这样做一定会出错,程序在这里中断,不再向下执行
}
}
当前异常为运行时异常 或非受检异常
数组越界,在程序运行时报错
非运行时异常(受检异常):
在程序运行之前被检验出来的异常
在运行之前就产生的异常
java
package DaiLi;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
//抛出异常解决
Class.forName("DaiLi.ClothesFactory");
}
}
找类对象时,在写代码的过程中,程序运行之前就产生异常
JAVA是如何解决异常的
1.try-catch-finally 解决错误
java
package DaiLi;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
int[] arr = new int[10];
int a = arr[11];//这样做一定会出错,程序在这里中断,不再向下执行
}
}
数组越界,用try-catch解决
java
package DaiLi;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
try{//这里被try-catch环绕,所以程序继续向下执行
int[] arr = new int[10];
int a = arr[11];//
//try尝试执行
}catch(Exception e){
e.printStackTrace();//输出错误
//catch报错执行
}
System.out.println("执行到这里");
}
}
如果去掉e.printStackTrace();
则不会打印异常
catch的使用
可以有多个catch,进行多重拦截,进行异常匹配,执行对应的catch中的内容。
java
package DaiLi;
import java.util.prefs.BackingStoreException;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
try{//这里被try-catch环绕,所以程序继续向下执行
int[] arr = new int[10];
int a = arr[11];//
//try尝试执行
}catch(NumberFormatException e){
e.printStackTrace();//输出错误
//catch报错执行
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
System.out.println("执行到这里");
}
}
如果不知道写哪个异常,写Exception , 因为Exception 是所有异常的父类主要使用多态
2.throws抛出异常:在方法当中抛出异常,由方法的调用者解决
并没有解决异常,而是把异常交给别人解决。
java
package DaiLi;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
run();
}
public static void run() throws ClassNotFoundException {
Class.forName("DaiLi.ClothesFactory");
}
}
Finally:
无论try所指定的程序块中是否抛出异常,也无论catch语句的异常类型是否与所抛弃的异常的类型一致,finally中的代码一定会得到执行
finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理
通常在finally语句中可以进行资源的清除工作,如关闭打开的文件、副除临时文件等
有异常的情况
java
package DaiLi;
import java.util.prefs.BackingStoreException;
public class Test {
public static void main(String[] args){
try{
int[] arr = new int[10];
int a = arr[11];
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
}
无异常的情况
java
package DaiLi;
import java.util.prefs.BackingStoreException;
public class Test {
public static void main(String[] args) {
try{
int[] arr = new int[10];
int a = arr[4];
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
}