一、认识异常
什么是异常?
指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止
二、异常体系
Error:系统级别问题,代码无法控制。
RuntimeException及其子类:运行时异常,非受检异常,编译阶段不会检查,但是运行时可能会出现的异常。
常见的运行时异常有:
ArrayIndexOutOfBoundsException 数组角标越界异常
ClassCastException 类型转换异常
NullPointerException 空指针异常
ArithmeticException 算术异常
除RuntimeException之外所有的异常:编译时异常,受检异常,编译期就强制必须处理的,否则程序不能通过编译。
编译时异常的作用是什么:
在编译阶段就警告程序员可能出现的问题, 提醒程序员提前做好应对异常的准备。
异常的处理方式:
异常的处理方式1-throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
//写法一:
方法 throws 异常1 ,异常2 ,异常3 ..{
}
//写法二:
方法 throws Exception{
}
异常处理方式2-try...catch...finally:监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
//写法一:
try{
// 监视可能出现异常的代码!
}catch(异常类型1 变量){
// 处理异常
}catch(异常类型2 变量){
// 处理异常
}...
finally{
//释放资源或其他逻辑
}
//写法二:
try{
// 可能出现异常的代码!
}catch (异常类型1 | 异常类型2 e){
e.printStackTrace(); // 直接打印异常栈信息
}finally{
//释放资源或其他逻辑
}
//写法三:
try{
// 可能出现异常的代码!
}catch (Exception e){
e.printStackTrace(); // 直接打印异常栈信息
}finally{
//释放资源或其他逻辑
}
三、自定义异常
1. 定义一个异常类继承Exception或RuntimeException。
2. 重写构造器(空参、带参)。
3. 在出现异常的地方用throw new 自定义对象抛出。
自定义异常案例:
-
定义一个“年龄异常类”:AgeException,使其继承自RuntimeException,并添加无参、String参数的构造方法;
//自定义异常 public class AgeException extends RuntimeException{ public AgeException() { } public AgeException(String message) { super(message); } }
-
定义一个“性别异常类”:SexException,使其继承自RuntimeException,并添加无参、String参数的构造方法;
//自定义异常 public class SexException extends RuntimeException{ public SexException() { } public SexException(String message) { super(message); } }
-
定义一个Student类,属性:姓名、性别、年龄。 在性别的set方法中判断是否是男/女,如果不是则抛出:性别异常 在年龄的set方法中判断年龄是否是15--50之间,如果不是则抛出:年龄异常
public class Student { private String name; private String gender; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { //判断是否是男/女,如果不是则抛出:性别异常 if(gender.equals("男")||gender.equals("女")){ this.gender = gender; }else { throw new SexException("性别异常"); } } public int getAge() { return age; } public void setAge(int age) { //判断年龄是否是15--50之间,如果不是则抛出:年龄异常 if ((age >= 15)&&(age <= 50)) { this.age = age; }else throw new AgeException("年龄异常"); } }
-
编写测试类,创建一个Student对象,并在try{}中调用setXxx()方法为对象属性赋值,在catch()中打印年龄错误。
import java.util.Scanner;
public class StudentTest {
public static void main(String[] args) {
Student student = new Student();
Scanner scanner = new Scanner(System.in);
try {
System.out.println("请输入姓名:");
String name = scanner.next();
student.setName(name);
System.out.println("请输入性别:");
String gender = scanner.next();
student.setGender(gender);
System.out.println("请输入年龄:");
int age = scanner.nextInt();
student.setAge(age);
System.out.println("输入的信息为"+name+"、"+gender+"、"+age);
} catch (AgeException e) {
throw new AgeException("年龄错误");
}
}
}
#学无止尽 #记录并分享我的学习日常