JAVA后端面试《异常》

1. throw和throws的区别?

  • throws用来声明一个方法可能抛出的所有异常信息,交由调用者处理异常。
  • thorw用在方法内,指抛出的一个具体的异常的类型。

2.Java中异常有哪几类?

  • java中的异常主要分为Error和Exception。
    在这里插入图片描述

3.final、finally、finalize的区别?

  • final用于声明属性,方法和类,分别表示属性不可变,方法不可被重写,类不可被继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是Object的一个方法,垃圾收集器执行的时候会调用被回收对象的此方法。

4.try-catch-finally那个部分可以省略?

  • catch 和 finally 语句块可以省略其中一个。
public class Test {
 
    public static void main(String[] args) {
        omitFinally();
        omitCatch();
    }
    
    /**
     * 省略finally 语句块
     */
    public static void omitFinally() {
        try {
            int i = 0;
            i += 2;
            System.out.println(i);//2
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 省略 catch 语句块
     */
    public static void omitCatch() {
        int i = 0;
        try {
            i += 1;
        } finally {
            i = 12;
        }
        System.out.println(i);//12
    }
}

5.try-catch-finally中,如果catch中return了,finally还会执行嘛?

  • 会执行,在return前执行。
public class Demo {
    public static void main(String[] args) {
        System.out.println(getInt());
        /*输出:finally=40
                30     */

    }

    public static int getInt() {
        int a = 10;
        try {
            System.out.println(a / 0);
            a = 20;
        } catch (ArithmeticException e) {
            a = 30;
            return a;
            /*
             * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
             * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
             * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
             */
        } finally {
            a = 40;
            System.out.println("finally="+a);
        }

       return a;
    }
}
public class Demo2 {
    public static void main(String[] args) {
        System.out.println(getInt());//输出40
    }

    public static int getInt() {
        int a = 10;
        try {
            System.out.println(a / 0);
            a = 20;
        } catch (ArithmeticException e) {
            a = 30;
            return a;
            /*
             * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
             * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
             * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
             */
        } finally {
            a = 40;
            return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
        }
    }
}

6.常见的异常类有哪些?

一、编译时异常:

  • 1.除0发生算术异常(ArithmeticException)
  • 2.数组下标越界异常(ArrayIndexOutOfException)
  • 3.数组元素类型不匹配异常(ArrayStoreException)
  • 4.强制类型转换异常(ClassCastException)
  • 5.索引越界异常(IndexOutOfBoundsException):索引越界异常在某排序索引(例如对字符串或数组的排序)超出范围是抛出。
  • 6.空指针异常(NullPointerException):null对象调用实例方法时抛出
  • 7.数字格式转换异常(NumberFormatException):把一个格式不对的字符串转换成一个数值类型。
  • 8.字符串索引越界异常(SrtringIndexOutException):用非法索引访问字符串抛出的异常。如果索引为负或大于等于字符串的大小,则该索引为非法索引。
  • 9.操作错误(UnsupportedOperationException)
    二、运行时异常:
  • 1.找不到指定类时发生的异常(ClassNotFoundException):例当程序加载Class类中的forName()方法时,异常抛出。
  • 2.请求的方法不存在(NosuchMethodException):当程序试图调用某个类的某种方法,而该类中没有该方法的定义时抛出该异常。
发布了18 篇原创文章 · 获赞 6 · 访问量 1857

猜你喜欢

转载自blog.csdn.net/weixin_43766298/article/details/104161346