异常

1:异常(理解)
    (1)程序出现的不正常的情况。
    (2)异常的体系
        Throwable
            |--Error    严重问题,我们不处理。
            |--Exception
                |--RuntimeException    运行期异常,我们需要修正代码
                |--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
    (3)异常的处理:
        A:JVM的默认处理
            把异常的名称,原因,位置等信息输出在控制台,但是呢程序不能继续执行了。
        B:自己处理
            a:try...catch...finally
                自己编写处理代码,后面的程序可以继续执行
            b:throws
                把自己处理不了的,在方法上声明,告诉调用者,这里有问题
    (4)面试题
        A:编译期异常和运行期异常的区别?
            编译期异常 必须要处理的,否则编译不通过
            运行期异常 可以不处理,也可以处理
        B:throw和throws是的区别
            throw:
                在方法体中,后面跟的是异常对象名,并且只能是一个
                throw抛出的是一个异常对象,说明这里肯定有一个异常产生了
            throws:
                在方法声明上,后面跟的是异常的类名,可以是多个
                throws是声明方法有异常,是一种可能性,这个异常并不一定会产生
    (5)finally关键字及其面试题
        A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
        B:面试题
            a:final,finally,finalize的区别?
            b:如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后
                会,前。
                
                实际上在中间。这个上课我们讲过
        C:异常处理的变形
            try...catch...finally
            try...catch...
            try...catch...catch...
            try...catch...catch...fianlly
            try...finally
    (6)自定义异常
        继承自Exception或者RuntimeException,只需要提供无参构造和一个带参构造即可
    (7)异常的注意实现
        A:父的方法有异常抛出,子的重写方法在抛出异常的时候必须要小于等于父的异常 
        B:父的方法没有异常抛出,子的重写方法不能有异常抛出
        C:父的方法抛出多个异常,子的重写方法必须比父少或者小
 JDK7出现了一个新的异常处理方案:
         try{
  
         }catch(异常名1 | 异常名2 | ...  变量 ) {
              ...
         }
  
          注意:这个方法虽然简洁,但是也不够好。
              A:处理方式是一致的。(实际开发中,好多时候可能就是针对同类型的问题,给出同一个处理)
             B:多个异常间必须是平级关系。

  JDK7增加的新处理方式。

  尽量不要在main方法上抛出异常。

  throw抛出的是异常对象,不是异常名。

class ExceptionTest extends Throwable {
    public String getLocalizedMessage() {
        return "除数不能为0";
    }

}

public class ExceptionDemo {

    public static void main(String[] args) throws ExceptionTest {
        try {
            System.out.println(10 / 0);
        } catch (ArithmeticException a) {
            // 抛出异常对象
            throw new ExceptionTest();
        }

    }

}

Throws和Throw的区别

 * 格式:
 *         throws 异常类名
 *         注意:这个格式必须跟在方法的括号后面。
 * 
 * 注意:
 *         尽量不要在main方法上抛出异常。
 *         但是我讲课为了方便我就这样做了。
 * 
 * 小结:
 *         编译期异常抛出,将来调用者必须处理。
 *         运行期异常抛出,将来调用可以不用处理。

如何处理异常

  原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
  区别:
    后续程序需要继续运行就try
    后续程序不需要继续运行就throws

  catch语句中有return语句,finally语句还是会被执行。因为虚拟机没有退出,finally就会执行。在return语句之前执行,return语句之后不能有东西的。

int a = 10;
try{
    System.out.println(a / 10);
}catch (ArithmeticException e){
    a = 20
    return a;
    //程序执行到这里这里不是return a,而是return 20;
    //但是发现后面还有finally,所以继续执行finally的内容,a = 40
    //走完finally,再次返回以前的路径,return 20;
    //所以准确的说finally的代码不在return的前面,也不在return的后面,准确地说是在return的中间
}finally{
    a = 40;
    }
    //输出20
    System.out.println(a);
int a = 10;
try{
    System.out.println(a / 10);
}catch (ArithmeticException e){
    a = 20
    return a;
}finally{
    a = 40;
    //如果finally中有return语句,只能有一个return语句,这里执行完就会结束方法,执行下面的程序
    //所以finally块中有return a,下面输出a = 40
    return a;
    }
    //输出40
    System.out.println(a);

   自定义异常

    继承Exception:编译要检查

    继承RuntimeException:编译不检查,如果继承RuntimeException,就不需要在方法上throws。

class ExceptionTest extends Exception {
    public String getLocalizedMessage() {
        return "除数不能为0";
    }
    public String toString(){
        return this.getLocalizedMessage();
    }

}

public class ExceptionDemo {

    public static void main(String[] args) throws ExceptionTest {
        try {
            System.out.println(10 / 0);
        } catch (ArithmeticException a) {
            // 抛出异常对象
            //需要在方法上抛出声明
            throw new ExceptionTest();
        }

    }

}
class ExceptionTest extends RuntimeException {
    public String getLocalizedMessage() {
        return "除数不能为0";
    }
    public String toString(){
        return this.getLocalizedMessage();
    }

}

public class ExceptionDemo {

    public static void main(String[] args) {
        try {
            System.out.println(10 / 0);
        } catch (ArithmeticException a) {
            // 抛出异常对象
            //继承RuntimeException,不需要需要在方法上抛出声明
            throw new ExceptionTest();
        }

    }

}

  如果子类重写父类方法,子类方法内有异常,只能用try,不能用throws。

原文地址:https://www.cnblogs.com/changzuidaerguai/p/6873918.html