一、前言:
在我前面写的博客文章里有一篇叫《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、代码运行结果:
但是我们实际考虑一下,一个学生的年龄可能是一个负数吗?为了当我们输入年龄为负数时,会去提示一下。那么我们接下来这么去修改一下setAge()方法 :
public void setAge(int age) {
if(age<0){
return;
}
this.age = age;
}
这时再运行:
很奇怪啊,明明我们赋了值,却输出一个"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.二种运行结果:
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);
}
}
以上就是这次的案例介绍,具体的如上面讲的一样,看我之前写的博客!!