Java异常体系----深入讲解

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");
            }


        }


}
相关推荐
2601_966949652 分钟前
批量 K 线不只是提速:因子研究中的数据质量、复权与回测偏差
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
matlab代码2 分钟前
基于matlab水果识别系统(西红柿、香蕉、梨、青椒)【源码64期】
开发语言·matlab
我命由我123454 分钟前
Android Compose 开发,使用 ConstraintLayout,但是引入的是旧的 ConstraintLayout
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
王的宝库5 分钟前
Gin + GORM
开发语言·golang·gin
零基础的修炼8 分钟前
CUDA知识汇总
开发语言·c++·编辑器
钱栈up10 分钟前
mvn compile卡住半小时:定位并修复隐藏的类型不匹配编译错误
java·后端·maven
妙码生花11 分钟前
golang 应用服务端部署(使用 systemd 服务)
开发语言·人工智能·后端·golang·node.js·php·gin
Zane199413 分钟前
Lambda表达式没有类型,为什么还能被当成参数传来传去
java·后端
重生之小比特17 分钟前
【Java SE】运算符
java·开发语言
Patrick在香港26 分钟前
Claude + Python 数据管道:一次字段改名,786 行历史数据被静默重写
开发语言·windows·python·claude·数据工程·数据校验·数据管道