• 面试常问的异常体系


    1.java异常体系

            异常体系中最大的类Throwable类。

    2.Error类

            我们看到的错误就是它产生的具体对象。

            Error是程序无法处理的错误,它由jvm产生和抛出。

            OutOfMerroryError:内存溢出

            ThreadDeath:线程锁死,不释放一直占用着资源。

            这些异常发生时,jvm就会终止程序。

    3.Exception类

            异常是程序本身可以处理的。 通常分为运行时异常和非运行时异常。

            非运行时异常(受检异常):在编译的时候可能就会产生的异常,不在运行java命令之后发生,而是在运行javac命令的时候发生(就是在编译器编写的时候就会报错,报红线)。非运行时异常是RunTimeException以外的异常,类型都是属于Exception类。常见的有SQLException,IOException(输入输出,咱们当时上传图片就涉及到这个异常)或者程序员自定义的异常都是非运行时异常。这些异常程序必须处理。

            运行时异常(非受检异常):执行了java命令之后,发生的异常。运行时异常都是RunTimeException这个类或者其子类。常见的有NullPointerException(空指针异常,不运行的时候不会报错,运行了才能看见);IndexOutOfBoundsException(数组越界);ArithmeticException(除0异常,10/0)。这些异常程序可以选择处理,或者不选择处理。

    4.异常处理方式

            有异常不处理的后果:程序终止。

            一个catch块中只能监听一种类型。

            处理异常这两种没有类型区别,任何异常都可以适用,只不过推荐try...catch。

            方式:

                    ①try...catch

                            这种属于自己处理,有责任心。

                            一个catch块中只能监听一种类型。

    1. public class Test {
    2. public static void main(String[] args) {
    3. int[] a = new int[5];
    4. try {
    5. for(int i = 0; i < 10;i++) { //加上try...catch之后就算出错也会执行下面的初始化成功字样
    6. a[i] = i;
    7. }
    8. }catch(Exception e){ //也可以填ArrayIndexOutOfBoundsException这个类,这采用多态写法,是Exception的子类,但结果没区别
    9. e.printStackTrace();
    10. }
    11. System.out.println("-----初始化成功-----------");
    12. }
    13. }

     

            ②throws抛出

                    这种只是抛出去(甩锅),让之后调用该异常方法的方法进行处理,如果只是抛的话,每一级都需要处理该异常。

                    如果在main中这种错误真的发生了,还是继续往上抛的话,就会交给jvm,那么程序就会终止,后果严重。

    1. public class Test1 {
    2. public static void main(String[] args) throws CloneNotSupportedException {
    3. Test1 t1 = new Test1(); //如果方法是静态方法就可以取消这一步了
    4. t1.run();
    5. }
    6. public void run() throws CloneNotSupportedException {
    7. sun();
    8. }
    9. //处理异常的另一种方式throws 抛出异常
    10. public void sun() throws CloneNotSupportedException {
    11. User user1 = new User();
    12. user1.clone();
    13. }
    14. }

    5.try...catch...finally

            catch中的语句,只有异常发生了,catch中的语句才会执行。而finally无论是否发生异常,都会执行里面的语句。

    使用注意事项:

            ①try...catch...finally均不能单独使用,但是可以组合使用。

            ②组合的结构有三种:try...catch...finally;try...catch;try...finally

            ③catch块可以有好多个,但是finally最多有一个。

    1. try {
    2. for(int i = 0; i < 10;i++) { //加上try...catch就会出错也会执行下面的初始化成功字样
    3. a[i] = i;
    4. }
    5. }catch(ArrayIndexOutOfBoundsException e){
    6. }catch(Exception e){
    7. e.printStackTrace();
    8. }finally {
    9. System.out.println("111");
    10. }

            ④catch块有多个 的时候,优先匹配子类异常,在写父类异常,否则会报错,写的时候也是先写子类再写父类。

            ⑤多个catch块的时候,最多只会匹配一个catch块,而不再执行其他catch块,且catch块的匹配顺序是从上到下的,也可能所有catch块都不执行(没有发生错误的时候)。

            ⑥try...catch...finally中的变量均为局部变量,不能相互访问。

    1. try {
    2. //int b;
    3. for(int i = 0; i < 10;i++) { //加上try...catch就会出错也会执行下面的初始化成功字样
    4. a[i] = i;
    5. }
    6. }catch(ArrayIndexOutOfBoundsException e){ //也可以填ArrayIndexOutOfBoundsException这个类,这采用多态写法,是Exception的子类,但结果没区别
    7. //System.out.println(b); //b无法访问,因为try中的是局部变量
    8. e.printStackTrace(); //整个错误信息打印出来 e.getMessage()错误的备注信息,如by zero
    9. }

    6.throws与throw

            throws关键字 声明的方法表示该方法不处理异常,而是交给方法的调用者。可以主动加,比如除0异常只有运行的时候才会报错,为了以防万一,可以抛出异常,这样会使调用该异常方法的方法强制处理。

            throw关键字 作用是抛异常,抛出的时候是一个异常类的实例化对象

    1. public class Test3 {
    2. public static void main(String[] args) {
    3. // Math math = new Math();
    4. // try {
    5. // math.div(10, 0);
    6. // }catch(Exception e){
    7. // System.out.println(e.getMessage());
    8. // }
    9. try {
    10. throw new Exception("自己抛着玩"); //自己写的一个错误,非运行异常,只能抛一个异常对象
    11. } catch (Exception e) {
    12. // TODO Auto-generated catch block
    13. e.printStackTrace();
    14. }
    15. }
    16. }
    17. class Math{
    18. public int div(int i,int j) throws Exception,ArithmeticException{ //可以跟多个异常类名
    19. int temp = i/j;
    20. return temp;
    21. }
    22. }

    区别:

            throws:是用来声明一个方法可能产生的异常,不作任何处理而是将异常向上传递,谁调用抛给谁,谁处理。

                    ①用在方法声明后面,跟的是异常类

                    ②可以跟多个异常类名,用逗号隔开

                    ③表示抛出异常,由该方法的调用者处理

                    ④throws表示出现异常的一种可能性,不一定发生异常

            throw:是用来抛出一个具体的异常

                    ①用在方法体内,跟的是异常类对象

                    ②只能抛一个异常对象

                    ③表示抛出异常,由方法体内的语句处理

                    ④throw抛出异常,是一定会发生的异常(自己写的异常错误,当然是一定发生)

  • 相关阅读:
    电脑如何下载视频号的视频?电脑微信视频号使用的方法!
    RADIUS 如何提高 WiFi 无线网络安全性
    C进阶-自定义类型:结构体、枚举、联合
    使用 GitHub Actions 编译和发布 Android APK
    【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)
    vue自定义指令directives
    sublime 3 for mac安装与使用
    用HTML、CSS技术设计的个人网页与实现制作(web前端期末大作业)
    Day46 动态规划 part08
    Mysql配置参数
  • 原文地址:https://blog.csdn.net/weixin_53170971/article/details/126223083