zoukankan      html  css  js  c++  java
  • java-异常处理1

    概要图

    异常讲解流程图

    一 java 异常和错误层次图

    1.1 图1

     1.2 图2

    二 异常生的过程

    1 异常可以结束函数.

      同时也让程序结束了.

     三 异常和错误的发生和区别


    Java运行时期发生的问题就是异常。

    Java中运行时发生的除了异常Exception还有错误Error。

    异常:通常发生可以有针对性的处理方式的。如:定义一个数组arr[3],但是你要访问第4个值 .就会发生数组index越界
    错误:通常发生后不会有针对性的处理方式如:定义一个数组arr[1024*1024*1024] 发生内存不足
    Error的发生往往都是系统级别的问题,都是jvm所在系统发生的并反馈给jvm的。
    无法针对处理,只能修正代码。

    3.1 异常

    如:定义一个数组arr[3],但是你要访问第4个值 .就会发生数组index越界

     3.2 错误

    如:定义一个数组arr[1024*1024*1024] 发生内存不足

    四 异常的的简单应用

    异常的应用:

    在编写程序时,必须要考虑程序的问题情况。
    举例:卖水果功能需要传递钱参数,有可能有假币。
    所以定义定义程序需要考虑程序的健壮性。

    加入一些逻辑性的判断。

    4.1 自己抛异常

    class Demo
    {
    /*
    对给定的数组通过给定的角标获取元素。
    */
    int getElement(int[] arr,int index)
    {
    /*1
    jvm出了问题,自己打包对象并抛出。
    但是它所提供的信息不够给力。想要更清晰,需要自己写。
    它的抛出不满足我们的要求。准备自己抛*/
    // 自己写的
    if(arr==null) { throw new NullPointerException("arr指向的数组不存在"); } if(index<0 || index>=arr.length) {
    // 2
    //该条件如果满足,功能已经无法继续运算。这时 就必须结束功能,并将问题告知给调用者。这时就需要通过异常来解决。 //怎么用呢? //1,创建一个异常对象。封装一些提示信息(自定义)。 //2,需要将这个对象告知给调用者。怎么告知呢?怎么将这个对象传递到调用者处呢?通过关键字throw就可以完成。 throw 异常对象; //3,throw用在函数内,抛出异常对象,并可以结束函数。 throw new ArrayIndexOutOfBoundsException("错误的角标,"+index+"索引在数组中不存在"); } int element = arr[index]; return element; } }
    测试
    class ExceptionDemo3 { public static void main(String[] args) { Demo d = new Demo(); int[] arr = {34,12,67}; int num = d.getElement(null,2); //arr指向的数组不存在
    System.out.println("num="+num); System.out.println("over"); } }

     4.2 小练习

     4.2.1 问题

    public class Test {
    
        public static void main(String[] args) {
            Person p = new Person("qq",-5);
            
    
        }
    
    }
    class Person
    {
        private String name;
        private int age;
        Person(String name,int age)
        {
            //加入逻辑判断。
            if(age<0 || age>200)
            {
                
                System.out.println("年龄数值错误");
                return;//终止初始化。
    
            }
            this.name = name;
            this.age = age;
        }
        //定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
        public String toString()
        {
            return "Person[name="+name+",age="+age+"]";
        }
    }
    结果

    这样做虽然可以编译并运行看到提示消息,但是问题却没有发生,程序还在继续执行。并打印p对象。
    这是不合理的。

    4.2.2改进用异常处理

    package test;
    
    public class Test {
    
        public static void main(String[] args) {
            Person p = new Person("qq", -5);
    
        }
    
    }
    
    class Person {
        private String name;
        private int age;
    
        Person(String name, int age) {
            // 加入逻辑判断。
            if (age < 0 || age > 200) {
    
                throw new IllegalArgumentException(age + ",年龄数值非法"); // 这里发生了变化
            }
            this.name = name;
            this.age = age;
        }
    
        // 定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
        public String toString() {
            return "Person[name=" + name + ",age=" + age + "]";
        }
    }

     结果

     五 异常的自定义和体系

    5.1 自定义异常思考

    能不能定义一个符合我的程序要求的问题名称。

    异常的信息都可以自定义,那么异常的名字是否可以定义呢?是否可以定义成更符合自己程序的阅读呢?

    之前的几个异常都是java通过类进行的描述。并将问题封装成对象,这是符合面向对象思想。
    其实:异常就是将问题封装成了对象。

    所以我也准备对自己所需要的问题进行类的描述。

    5.2 自己定义并抛出

    package test;
    
    public class Test {
    
        public static void main(String[] args) {
            Person p = new Person("qq", -5);
    
        }
    
    }
    class NoAgeException{
        NoAgeException(){}
        NoAgeException(String message){}
    }
    
    class Person {
        private String name;
        private int age;
    
        Person(String name, int age) {
            // 加入逻辑判断。
            if (age < 0 || age > 200) {
    
                throw new NoAgeException(age + ",年龄数值非法");
            }
            this.name = name;
            this.age = age;
        }
    
        // 定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
        public String toString() {
            return "Person[name=" + name + ",age=" + age + "]";
        }
    }
    结果
     

     5.3 自定义异常加上父类Throwable

    class NoAgeException extends Throwable{
        NoAgeException(){}
        NoAgeException(String message){}
    }
    结果

     5.4  自定义异常加上父类RunTimeException

     加上super(message)得到结果


    作者:8亩田
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

    本文如对您有帮助,还请多帮 【推荐】 下此文。
    如果喜欢我的文章,请关注我的公众号
    如果有疑问,请下面留言

    学而不思则罔 思而不学则殆
  • 相关阅读:
    android AudioManager类详解
    Android的Media(录音,播放音乐,播放视频等)
    加载大图片报OOM错误
    cmd更换编码类型
    通讯录数据库插入数据
    开机自启加入任务栈
    特殊的广播接收者(界面注册)
    将Image的名字转换为R.image.id
    通过XML文件生成View
    判断某张表是否存在
  • 原文地址:https://www.cnblogs.com/liu-wang/p/8228876.html
Copyright © 2011-2022 走看看