异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,代码中少了一个分号,那么运行出来结果是提示是错误
java.lang.Error;
如果你用System.out.println(1/0)
,那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException
的异常。
从上面可以大概了解到什么是异常,一些异常都是 Java 内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中没有定义过,那如果Java内部定义的异常无法完成我们的需求的时候该怎么办呢?
例如,年龄负数问题,考试成绩负数问题,这时就需要我们自定义异常。 ,这时候就需要一个自定义异常了。
简言之:当Java中提供的异常不能满足我们的需求时,就需要自定义异常了,也就是说在开发中根据自己业务的异常情况来定义异常类。
那么该如何定义异常呢?
下面对如何定义异常进行简述以及演示:
如何自定义异常
-
实现步骤
- 定义异常类
- 写继承关系
- 提供空参构造
- 提供带参构造
-
注意
- 一般地,用户自定义异常类都是 RuntimeException 的子类;
- 自定义异常类通常需要编写几个重载的构造器;
- 自定义异常需要提供 serialVersionID;
- 自定义的异常通过 throw 抛出;
- 自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型;
-
建议:保留两种构造器的形式
-
无参构造
-
带给父类的message属性赋值的构造器
-
-
自定义异常的语法形式为:
<class><自定义异常名><extends><Exception>
语法示例:
public class XXXExcepiton extends Exception | RuntimeException{ {空参构造方法} {带给父类的message属性赋值的构造方法} }
-
在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用。
-
自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。
-
自定义异常需要注意什么
- 自定义异常类一般都是以Exception结尾,说明该类是一个异常类
- 自定义异常类,必须的继承Exception或者RuntimeException
- 继承Exception:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws,要么try…catch
- 继承RuntimeException:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)
自定义异常示例
实例说明:
- 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,超出这个范围是异常数据不能赋值。需要重新录入,一直录到正确为止。
代码示例:
异常类
public class AgeOutOfBoundsException extends RuntimeException {
public AgeOutOfBoundsException() {
}
public AgeOutOfBoundsException(String message) {
super(message);
}
}
学生类
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age >= 18 && age <= 25){
this.age = age;
}else{
//如果Java中提供的异常不能满足我们的需求,我们可以使用自定义的异常
throw new AgeOutOfBoundsException("年龄超出了范围");
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类
public class ExceptionDemo12 {
public static void main(String[] args) {
// 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,
// 超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。
Student s = new Student();
Scanner sc = new Scanner(System.in);
System.out.println("请输入姓名");
String name = sc.nextLine();
s.setName(name);
while(true){
System.out.println("请输入年龄");
String ageStr = sc.nextLine();
try {
int age = Integer.parseInt(ageStr);
s.setAge(age);
break;
} catch (NumberFormatException e) {
System.out.println("请输入一个整数");
continue;
} catch (AgeOutOfBoundsException e) {
System.out.println(e.toString());
System.out.println("请输入一个符合范围的年龄");
continue;
}
}
System.out.println(s);
}
}
以上内容是我对Java自定义异常的理解,如有错误(或内容不全),欢迎指正(或补充)。