JAVA后端面试《异常》

异常

    • 1. throw和throws的区别?
    • 2.Java中异常有哪几类?
    • 3.final、finally、finalize的区别?
    • 4.try-catch-finally那个部分可以省略?
    • 5.try-catch-finally中,如果catch中return了,finally还会执行嘛?
    • 6.常见的异常类有哪些?

1. throw和throws的区别?

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

2.Java中异常有哪几类?

  • java中的异常主要分为checked exception和unchecked exception。
  • 受检查异常(checked exception):必须被显式的抛出或捕获,除了运行时异常和Error,其余的都是受检查异常。
  • 不受检查异常(unchecked exception):不用被显式的抛出或捕获,包括RuntimeException和Error以及它们的子类。
    JAVA后端面试《异常》_第1张图片

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)

  • 10.找不到指定类时发生的异常(ClassNotFoundException):例当程序加载Class类中的forName()方法时,异常抛出。

  • 11.请求的方法不存在(NosuchMethodException):当程序试图调用某个类的某种方法,而该类中没有该方法的定义时抛出该异常。

你可能感兴趣的:(JAVA后端面试)