Java之异常(下):自定义异常类

一、前言:

  在我前面写的博客文章里有一篇叫《Java中关于自定义异常类的一些问题》,它里面讲到了大部分关于自定义异常的基础知识,如果大家想了解底层可以去那里查看。今天我将用一次细节的案例解析:我们所说的自定义异常类。

二、案例分析:

1、首先我先创建一个类:Student "学生"类,在里面有属于学生的成员变量(学号、年龄、性别等等),然后封装。

package com.feisi.ex;

public class Student {
    private String sid; //学号
    private int age;  //年龄
    private char sex;  //性别

    public Student() {
        this.sid="";
        this.age=0;
        this.sex=' ';
    }

    public Student(String sid, int age, char sex) {
        this.sid = sid;
        this.age = age;
        this.sex = sex;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }
}

2、再写一个测试类:Test_Student,创建Student类的对象,然后给它的年龄赋值一个"-10",并打印年龄。

package com.feisi.test;
import com.feisi.ex.*;
public class Test_Student {
    public static void main(String[] args) {
        Student student =new Student();
        student.setAge(-10);
        System.out.println(student.getAge());
    }
}

3、代码运行结果:

Java之异常(下):自定义异常类_第1张图片

但是我们实际考虑一下,一个学生的年龄可能是一个负数吗?为了当我们输入年龄为负数时,会去提示一下。那么我们接下来这么去修改一下setAge()方法 :

   public void setAge(int age) {
        if(age<0){
            return;
        }
        this.age = age;
    }

这时再运行:

 Java之异常(下):自定义异常类_第2张图片

很奇怪啊,明明我们赋了值,却输出一个"0" ,是不是会觉得莫名奇妙,而且又没有报错提醒 (就是如果出了问题又没报错,但是赋值输出又没成功) 。当代码很多的情况下,我们不知道哪个地方出了问题。所以我们是不是可以弄一个和之前讲的JDK提供自带的异常类(可以提示报错的):很相似的叫自定义异常类的东西。也就是当我们输入赋值的年龄是"-10"时,也可以提示报错。

4、改进与添加:

这时我创建一个自定义异常类叫:AgeException,并让它去继承Exception(因为它是所有异常类的父类),里面有一个成员变量。用来描述和打印:发生异常时的异常消息。还有当然这个时候:return 不能这么写了。具体写法如下:

(1)自定义异常类:AgeException 代码如下:

package com.feisi.ex;
//我自己定义的异常类:年龄异常
public class AgeException extends Exception {
    //异常提示文字描述信息
    private String message;
    public AgeException(){

    }
    public AgeException(String message){
        this.message=message;
    }

    public String getMessage() {
        return this.message;
    }
}

(2)setAge()方法修改:

/*  谁调用方法,谁就需要try...catch...处理这个异常  */
    public void setAge(int age) throws AgeException { //这里就是抛出去让调用者处理
        if(age<0){
            throw new AgeException("年龄不能小于0!");  //抛出年龄异常实例
            /*
            然后我们总不能自己写一个try..catch..去捕获处理吧。
            因为如果这样写了之后,当别人调用这个方法时是不是还是不知道哪里出了异常
            你自己解决掉了嘛,你没有抛出去给调用者
            */
        }
        this.age = age;
    }

(3)测试类修改:(因为它调用了这个方法,所以要进行try..catch..去捕获处理,接受:方法异常的抛出) 

1.

package com.feisi.test;
import com.feisi.ex.*;
public class Test_Student {
    public static void main(String[] args) {
        Student student =new Student();
        try {
            student.setAge(-10);
        } catch (AgeException e) {
            e.printStackTrace(); //打印异常堆栈信息
        }
        System.out.println(student.getAge());
    }
}

2. 或把那个方法变成:e.getMessage()

package com.feisi.test;
import com.feisi.ex.*;
public class Test_Student {
    public static void main(String[] args) {
        Student student =new Student();
        try {
            student.setAge(-10);
        } catch (AgeException e) {
            System.out.println(e.getMessage());//得到异常信息描述
        }
        System.out.println(student.getAge());
    }
}

其中那个异常对象调用的方法:

e.printStackTrace();意思是:打印异常堆栈信息。

e.getMessage();意思是:得到异常信息描述。

3.二种运行结果:

Java之异常(下):自定义异常类_第3张图片

 Java之异常(下):自定义异常类_第4张图片

4.小结:(具体的可以去看我之前写的博客《Java中关于自定义异常类的一些问题》)

 (1)throw表示抛出异常,语法是: 
          throw new 异常类型([异常信息]);
    
  (2)throws表示用来声明方法可能会抛出那些异常: 语法是:
          throws 异常类型1,异常类型2…

  

5.补充:

  (其实自定义异常类还可以这样简单写),也就是我们不用去写private String message;因为这里只是为了方便学习,告诉我们用这个来储存异常信息描述。因为它继承了Exception,它父类已经有了这个message成员,所以我们只需要用super()调用父类的构造方法:给message赋值,而且父类也有一个getMessage()方法,都可以直接用就行,不需要写。

  实际写法如下:

package com.feisi.ex;
//我自己定义的异常类:年龄异常
public class AgeException extends Exception {
    //异常提示文字描述信息
    public AgeException(){
         super();
    }
    public AgeException(String message){
        super(message);
    }

}

以上就是这次的案例介绍,具体的如上面讲的一样,看我之前写的博客!!

你可能感兴趣的:(java,开发语言)