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)得到结果

 

posted @ 2018-01-07 22:08  8亩田  阅读(218)  评论(0编辑  收藏  举报