异常
异常指的是程序在编译或者运行时出现不正常的现象。 Java语言的设计者,把一些常见的问题封装了异常类,有些异常是有共性的,所以就有了异常体系。
Throwable:异常体系的根类
--Error: 严重的错误
--Exception: 异常
--RuntimeException及其子类: 运行时异常
--非RuntimeException及其子类: 编译时异常
虚拟机默认处理异常
当程序出现的异常,虚拟机默认停止程序运行,并且把异常信息打印在控制台。
异常信息:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 3
at com.itheima.demo3.ExceptionDemo1.main(ExceptionDemo1.java:6)
throws声明异常
在写一个方法的时候,考虑到这个方法当中的代码可能会出现问题,在方法上使用throws声明一个异常,告诉调用者调用这个方法的时候,注意这个问题。
//别人调用该方法时,如果参数传错了就会出现ParseException异常
public static void method2(String birday) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(birday);
System.out.println(date);
}
try…catch处理异常
当调用别人定义好的方法,你担心出现异常。可以把这些代码用try…catch包裹起来,一旦出现异常就会被catch捕获到并处理,代码可以继续执行。
try {
有可能出现异常的代码
} catch (异常类名1 e){
如果出现异常,就会执行catch对应语句
} catch (异常类名2 e){
如果出现异常,就会执行catch对应语句
}
【注意:如果多个catch语句中的异常有继承关系,较大的异常需要写在下面】
自定义异常
当API中的异常名称,不足以描述程序中的问题时,可以自己写一个异常类。只需要继承Exception或者RuntimeException即可。
如下自定义一个异常类,用来描述年龄不正确异常。
public class AgeFalseExecption extends RuntimeException {
public AgeFalseExecption() {
}
public AgeFalseExecption(String message) {
super(message);
}
}
异常的练习
public class Student {
private int age;
private String name;
//要求:只有年龄在18~25岁之间,才可以赋值
public void setAge(int age) {
//先考虑不合法的情况,在不合法的情况下产生异常
if (age > 25 || age < 18) {
throw new AgeFalseExecption("年龄不合法");
}
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
public class ExceptionDemo3 {
public static void main(String[] args) {
Student stu = new Student();
Scanner sc = new Scanner(System.in);
System.out.println("键盘录入学生的姓名:");
String name = sc.next();
while (true) {
try {
System.out.println("键盘录入学生的年龄:");
String ageStr = sc.next();
//如果年龄不是纯数字,会出现格式不正确异常NumberFormatException
int age = Integer.parseInt(ageStr);
stu.setName(name);
//如果年龄不在18~25范围内,会出现AgeFalseException异常
stu.setAge(age);
break; //跳出循环
} catch (NumberFormatException e) {
e.printStackTrace();
System.out.println("输入的格式不对");
continue;
} catch (AgeFalseExecption e) {
e.printStackTrace();
System.out.println("年龄的范围不对");
continue;
}
}
System.out.println(stu);
}
}