异常

作者: 风吹稻子 | 来源:发表于2017-04-17 07:25 被阅读90次

    1.异常是什么?

    异常就是在本该顺理成章的地方发生了出乎意料的事情,这个“事情”就是异常。处理和解决这个事情,就是处理异常。

    举例:

    光头强像往常一样去砍树,突然发现刀没了。但是刀一直放在那个墙角啊,怎么会没了呢(异常)?最后只能去集市上买一把了,结果发现灰太狼在卖刀,才明白是灰太狼偷了他的刀(明白异常发生的原因)。还把灰太狼打了一顿,甚是高兴。(解决了bug,当然异常高兴)

    2.异常的父类?

    Object-->Throwable-->Exception -->运行时异常(RuntimeException)
                                   -->检查类异常(CheckedException)
                      -->Error及其子类只能用来处理系统内部程序的异常和运行环境的异常,一般与硬件有关
    

    解释:
    异常可以分为Exception和Error两大类,它们的父类都是Throwable,而Exception又可以分为RuntimeException和CheckedException两大类

    3.常出现的异常

    1. ArithmeticException
    2. ArrayIndexOutOfBoundException
    3. NullPointerException
    4. ClassNotFindExceotion
    5. IIIegalArgumentException
    6. ClassCastException
    7. NumberFormatException

    代码:

    package 异常;
    public class ExceptionTest {    
    public static void main(String[] args) {        
        int num = 5 / 0;
        System.out.println(num);        
    }
    

    }

    测试结果:

    Exception in thread "main" java.lang.ArithmeticException: / by zero
    at 异常.ExceptionTest.main(ExceptionTest.java:12)
    

    注意:当出现异常之后,后面代码不可被执行

    4.处理异常的方法

    1.
         try {
    
         } catch() {
            //先子类,后父类
            //只执行第一个成功匹配的异常
         }
    2.
        try{
    
        }catch(){
    
        }fianlly{
            //不管有没有异常都会被执行
            System.exit(-1)
        }
    3. 只有System.exit(-1);finally才不会执行,其他情况都会执行,即使在finally之前定义了return
    

    测试代码:

     package 异常;
    
    public class Test {     
        public static void main(String[] args) {            
                int[] a = {};
                System.out.println(a[0]);           
        }
    }
    

    测试结果:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at 异常.Test.main(Test.java:8)
    

    测试2(使用try catch finally)

     package 异常;
    
    public class Test {
        
        public static void main(String[] args) {
                try {
                    int[] a = {};
                    System.out.println(a[0]);
                } catch (Exception e) {
                    System.out.println("数组为空");
                } finally {
                    //除非System.in(-1),finally才不会被HI行
                    System.out.println("始终会被执行");
                        
                }   
        }
    }
    

    测试结果:

    数组为空
    始终会被执行
    

    5.捕获异常的过程

    当代码产生异常后,系统会自动创建一个异常对象,如果系统创建的异常对象和catch(异常对象)中的异常对象一致,就会执行catch中的内容

    代码测试:
    package 异常;

    public class ExceptionTest {
        
        public static void main(String[] args) {
            try {
                int num = 5 / 0;
                System.out.println(num);
            } catch (NullPointerException e) {
                System.out.println("出错了");
            }                       
        }       
        
    }
    

    测试结果:

    Exception in thread "main" java.lang.ArithmeticException: / by zero
    at 异常.ExceptionTest.main(ExceptionTest.java:7)
    

    总结:从上可以看出,如果捕获的异常不匹配,结果还是会报异常
    注意:在try里面,一旦异常发生,后面的部分代码就不再执行。

    6.为当前项目创建自己独有的异常类型

    创建一个自己的异常类,继承自IllegalArgumentException异常类
    package 异常;

    public class AgeOverException extends IllegalArgumentException{
    
    //构造方法
    public AgeOverException(){}
    
    public AgeOverException(String msg){
        super(msg);
    }
    

    }

    测试类

    package 异常;
    
    public class Student {
    
        private int age;
    
        public int getAge() {
            return age;
        }
        
        //声明异常
        public void setAge(int age) throws Exception{
            if (age > 0 && age < 100) {
                this.age = age;
            } else {
                //抛出异常
                throw new AgeOverException("用户输入的年龄不对");
            }
        }
    
        public static void main(String[] args) throws Exception {
            Student s = new Student();
            s.setAge(120);
        }
    }
    

    测试结果:

    Exception in thread "main" 异常.AgeOverException: 用户输入的年龄不对
    at 异常.Student.setAge(Student.java:17)
    at 异常.Student.main(Student.java:23)
    

    7.其他问题

    1.什么是检查异常

    检查异常:如果当前的方法在运行时可能会出现异常,那么我们就需要声明异常,以便于在调用的时候捕获异常。防止程序中断。

    2.什么是运行时异常

    运行时异常:运行时产生的错误

    3.声明异常和抛出异常的区别?

    1. 声明异常: throws,声明异常后需要在调用方法时,捕获异常
    2. 抛出异常: throw

    4.为什么为方法添加声明异常

    如果当前方法出错,将会影响后续程序的执行,如果不想影响,需要提前给方法声明异常,使用时提示捕获异常。

    5.抛出异常的意义

    可以终止程序的允许,如果当前方法无法完成,后续操作也无须执行。但是抛出异常后,后续程序可以运行

    6.处理异常的优点:

    增加程序的健壮性

    相关文章

      网友评论

      本文标题:异常

      本文链接:https://www.haomeiwen.com/subject/ebizattx.html