• 异常


    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。

  • 相关阅读:
    Ubuntu安装后root 用户无法使用的解决方法
    struts2 上传 文件 注意问题
    WinSCP无法连接 ubuntu 的解决方法
    TOMCAT 6 中配置HTTPS
    Linux上安装ImageMagick和JMagick
    linux 下 Nginx 0.8.40的安装
    Displaying icons in a Flex List control
    Styling the Alert control’s message text
    Displaying icons in a Flex ComboBox control
    Styling the Alert control’s title bar
  • 原文地址:https://www.cnblogs.com/changzuidaerguai/p/6873918.html
Copyright © 2020-2023  润新知