• 异常


    异常指代码编译运行时出现的问题

    总称Exception,祖宗类Throwable

    它的子类很多,大部分都是编译时错误,但RuntimeException子类确实运行时错误。

    l RuntimeException和他的所有子类异常,都属于运行时期异常。Exception,ArrayIndexOutOfBoundsException等都属于运行时期异常.

    运行时期异常的特点:

    方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常

    运行时期异常一旦发生,需要程序人员修改源代码.

    总结:

    Throwable: 它是所有错误与异常的超类(祖宗类)
            |- Error 错误
            |- Exception 编译期异常,进行编译JAVA程序时出现的问题
                |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

    异常和错误不同点在于,错误会直接报错,就像游戏突然未响应,这就是报错。

    而拿两个常见的异常来看虽然报错,但是我们可以修改代码。

    package com.oracle.demo03;
    //Error:癌症只能修改代码
    //Exception:异常 
    //RuntimeException-》癌症,没法处理,只能改代码
    //Exception->感冒,可以处理
    public class Demo01 {
        public static void main(String[] args) {
            int [] arr=new int[1000000000000000];
            //OutOfMemoryError创建数组时,空间过大
        }
    
    }

    package com.oracle.demo03;
    
    public class Demo02 {
        public static void main(String[] args) {
            int [] arr={4,5};
            int num=get(arr);//数组索引越界异常ArrayIndexOfBoundsException
            System.out.println(num);
        }
        public static int get(int [] arr){
            int i=arr[2];
            return i;
        }
        
    }

    当我们看到这些控制台打印报错时,多亏了程序的帮忙,但是问题来了,我们如何对待这些异常呢?

    有两种方式,throws和trycatchfindly

    ①throw抛出异常

    声明异常throws

    常用方法

    package com.oracle.demo04;
    
    public class Demo07 {
        public static void main(String[] args) {
            //将异常给main
            int [] arr=null;
            //可能会产生异常代码
            int num=getArr(arr);
            System.out.println(num);
            
        }
        //修饰符 返回值类型 方法名(参数)throw是 异常类名1 异常类名2
        public static int getArr(int [] arr) {
        if(arr==null){
                throw new NullPointerException("你传的数组是null");
                //格式:throw new 异常类名()
                //将异常传给调用者,抛出异常
            }
        if(arr.length==0){
            throw new ArrayIndexOutOfBoundsException("你传的数组没有值");
        }
            int i=arr[arr.length-1];//传最后一位,空值不行
            return i;
        }
    }
    也就是说,当我们的throw抛出异常给调用者,throws声明异常在方法里面,调用者发现我调用了这个异常方法,找找到了你这个判断,arr是空集合呀,然后控制台就提示出来了数组是null。

    ②trycatchfindly

     图解:

    package com.oracle.demo04;
    
    public class Demo5 {
        public static void main(String[] args) {
            //将异常给main
            //int [] arr=null;
            int [] arr={};//有数组但是没元素
            
            //可能会产生异常代码,一般是传数和输出
            try{
            int num=getArr(arr);
            System.out.println(num);
            }
            catch(NullPointerException ex){//抛啥补啥,你的不合法
                ex.printStackTrace();
            }catch(ArrayIndexOutOfBoundsException ex){
                ex.printStackTrace();
            }
            catch(Exception ex){//运行产生异常,直接捕获处理,父类类型写最后面
                System.out.println("出错啦");
                ex.printStackTrace();
            }
            finally{
                System.out.println("不论发生异常与否,一定会执行的代码");
            }
            System.out.println("HelloWord");
        }
        //修饰符 返回值类型 方法名(参数)throw是 异常类名1 异常类名2
        public static int getArr(int [] arr) throws NullPointerException,
        ArrayIndexOutOfBoundsException {
        if(arr==null){
                throw new NullPointerException("你传的数组是null");
                //格式:throw new 异常类名()
                //将异常传给调用者
            }
        if(arr.length==0){//数组越界
            throw new ArrayIndexOutOfBoundsException
            ("你穿的数组中没有值");
            }
            int i=arr[arr.length-1];//传最后一位,空值不行
            return i;
        }
    }

    try的原则就是将可以导致报错的代码放在一起,catch就是报错之后去寻找到底是哪个错误,finadlly就是错误也会执行的代码。

     因为java所有都是具有面向对象思想的,所以异常也是会继承的,这里循序的原则是,父类有子类可以重写,父类没有,子类不能重写。

    比较特殊的情况是如果接口没有声明异常,但是子类有异常,只能用try  catch捕获,所以这个比较万能。

    异类也是有方法的

    如我们前面的catch中捕获的catch(xxx e){

    e.xxx();里面可以写toString 和printStrackTrace 和getMessage

    }

    自定义异常

    所有我们的自定义类都要有是哪个原则,①自定义类②自定义异常③测试类

    package com.oracle.demo05;
    
    public class Person extends RuntimeException {
        private String name;
        private int age;
        
        public Person(int age ,String name) {
            super();
                if(age>200||age<0){
                    throw new ChaoChuException("超出"+age);
                }
        }
                public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
                @Override
                public String toString() {
                    return "Person [name=" + name + ", age=" + age + "]";
                }
    }

    自定义类里面我们写判断条件,并且抛出异常。

    package com.oracle.demo05;
    
    public class ChaoChuException  extends RuntimeException{
        
        public ChaoChuException (String mess){
            super(mess);
        }
    
    }

    自定义异常里面继承运行期错误,继承运行期错误,并且写一个构造函数,传一个提示参数字符串类,但是目前的构造的方法没有可以在控制台上搞提示的怎么办,这时候我们就可以采用super(实参)

    package com.oracle.demo05;
    
    public class Demo05 {
        public static void main(String[] args) {
            //Person p=new Person(-1,"lala");
            get();
                
        }
        public static void get(){
            Person p=new Person(1000,"lala");
            
        }
        
    }
        

  • 相关阅读:
    课程总结
    2018-2019-2 20189205《移动平台应用开发实践》第一周作业
    2019年3月3日 2018-2019-2 20189205《移动平台应用开发实践》第二周作业
    2018-2019-2 20189205《移动平台应用开发实践》第十二周作业
    2018-2019-2 20189205《移动平台应用开发实践》第十一周作业
    项目代码分析
    2018-2019-2 20189205《移动平台应用开发实践》第十周作业
    博客分工
    2018-2019-2 20189205《移动平台应用开发实践》第九周作业
    2018-2019-2 20189205《移动平台应用开发实践》第八周作业
  • 原文地址:https://www.cnblogs.com/a199706/p/11362337.html
Copyright © 2020-2023  润新知