一、异常体系介绍
Error:代表的系统级别的错误(属于严重问题)
系统一旦出现问题,sun公司会把这些错误封装成Error对象
Error是给sun公司自己用的,开发人员不需要处理
Exception:叫做异常,代表程序可能出现问题。
我们通常会用Exception以及他的子类来封装程序出现的问题
运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒
运行时出现的异常(如:数组索引越界异常)
编译时异常:编译阶段就会出现异常提醒的(如:日期解析异常)
二、异常的作用
作用一:异常是用来查询bug的关键参考信息
作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
三、异常的处理方式
1、JVM默认的处理方式
(1)把异常的名称,异常原因及异常出现的位置等信息输出在控制台
(2)程序停止执行,下面的代码就不会再执行了
2、 捕获异常(自己处理)
格式:
try{
//可能出现异常的代码
} catch (异常类名 变量名) {
//异常的处理代码
}
注:
(1)如果try中没有遇到问题,怎么执行?
会把try里面所有的代码都执行完毕,不会执行catch里面的代码。只有出现了异常才会执行
catch里面的代码。
(2)如果try中可能遇到多个问题,怎么执行?
会写多个catch与之对应。如果要捕获多个异常,这些异常中如果存在父子关系的话,那么父
类一定要写在下面。
在JDK7之后,若出现的多个异常采用同一个处理办法时,可以将多个异常通过" | "的符号写
在同一个catch中
(3)如果try中遇到的问题没有被捕获,怎么执行?
采用JVM虚拟机默认处理异常的方式
(4)如果try中遇到了问题,那么try下面的其他代码还会执行吗?
不会执行,会直接跳转到对应的catch当中,执行catch里面的语句体
Throwable的成员方法:
public String getMessage()
//返回此throwable的详细消息字符串
public String toString()
//返回此可抛出的简短描述
public void printStackTrace()
//把异常的错误信息输出在控制台
3、抛出异常
(1)throws:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可以会
有哪些异常
public void 方法() throws 异常类名1,异常类名2...{
...
}
注意:
编译时异常:必须要写
运行时异常:可以不写
(2)throw:写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的
代码不再执行了
public void 方法(){
throw new NullPointerException();
}
例题:
public class ExceptionDemo2 {
public static void main(String[] args) {
/*
需求:键盘录入学生的姓名和年龄
姓名的长度在3~10之间
年龄的范围为18~40岁
超出这个范围时异常数据不能赋值,需要重新录入,一直到录入正确为止
提示:需要考虑用户在键盘录入时的所有情况
比如:录入年龄时超出范围,录入年龄时录入了abc等情况
*/
Scanner sc=new Scanner(System.in);
Student stu=new Student();
while (true) {
try {
//接收异常
System.out.println("请输入学生的姓名");
String name = sc.nextLine();
stu.setName(name);
System.out.println("请输入学生的年龄");
String ageStr=sc.nextLine();
int age=Integer.parseInt(ageStr);
stu.setAge(age);
//如果所有数据都正确,跳出
break;
} catch (NumberFormatException e) {
System.out.println("年龄格式有误,请输入数字");
} catch (RuntimeException e) {
System.out.println("姓名长度或年龄范围有误");
}
}
System.out.println(stu);
}
}
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) {
int length = name.length();
if (length < 3 || length > 10) {
//抛出异常
throw new RuntimeException();
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 18 || age > 40) {
//抛出异常
throw new RuntimeException();
}
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
四、自定义异常
1、定义异常类:见名知意
2、写继承关系
3、空参构造
4、带参构造
例:引用上一个例题
//创建name错误产生的自定义异常类
public class NameFormatException extends RuntimeException{
public NameFormatException() {
}
public NameFormatException(String message) {
super(message);
}
}
//创建age不符合产生的自定义异常类
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) {
int length = name.length();
if (length < 3 || length > 10) {
//引用自定义异常类
throw new NameFormatException(name+"格式有误,长度应该为:3-10");
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 18 || age > 40) {
//引用自定义异常类
throw new AgeOutOfBoundsException(age+"超出范围");
}
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
public class ExceptionDemo2 {
public static void main(String[] args) {
/*
需求:键盘录入学生的姓名和年龄
姓名的长度在3~10之间
年龄的范围为18~40岁
超出这个范围时异常数据不能赋值,需要重新录入,一直到录入正确为止
提示:需要考虑用户在键盘录入时的所有情况
比如:录入年龄时超出范围,录入年龄时录入了abc等情况
*/
Scanner sc = new Scanner(System.in);
Student stu = new Student();
while (true) {
try {
System.out.println("请输入学生的姓名");
String name = sc.nextLine();
stu.setName(name);
System.out.println("请输入学生的年龄");
String ageStr = sc.nextLine();
int age = Integer.parseInt(ageStr);
stu.setAge(age);
//如果所有数据都正确,跳出
break;
} catch (NumberFormatException | NameFormatException | AgeOutOfBoundsException e) {
e.printStackTrace();
}
}
System.out.println(stu);
}
}
//测试结果:
/*
请输入学生的姓名
aaaaaaaaaaaaaaaaaaaaa
com.Exception.NameFormatException: aaaaaaaaaaaaaaaaaaaaa格式有误,长度应该为:3-10
at com.Exception.Student.setName(Student.java:22)
at com.Exception.ExceptionDemo2.main(ExceptionDemo2.java:23)
请输入学生的姓名
aaa
请输入学生的年龄
45
com.Exception.AgeOutOfBoundsException: 45超出范围
at com.Exception.Student.setAge(Student.java:34)
at com.Exception.ExceptionDemo2.main(ExceptionDemo2.java:28)
请输入学生的姓名
aaa
请输入学生的年龄
23
Student{name = aaa, age = 23}
*/
觉得有用就点点赞吧~