在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。
异常的根类是Throwable,其下有两个子类:Error与Exception,平常所说的异常指Exception。
l 严重错误Error,无法通过处理的错误
l 编译时异常Exception,编译时无法编译通过。如日期格式化异常
l 运行时异常RuntimeException,是Exception的子类,运行时可能会报错,可以不处理。如数学异常
l 创建异常对象(JDK已定义的异常会自动创建对象,自定义异常需要手动创建)
l 抛出异常(JDK已有定义的异常会自动抛出异常,自定义异常需要手动抛出)
l 处理异常:
捕获处理,将异常获取,使用try/catch做分支处理
try{
需要检测的异常;
} catch(异常对象) {
异常处理代码
可以调用异常的方法
通常我们只使用一个方法:printStackTrace打印异常信息
}
声明抛出处理,出现异常后不处理,声明抛出给调用者处理。
方法声明上加throws 异常类名
注意:异常处理,指处理的一种可能性,即有了异常处理的代码,不一定会产生异常。如果没有产生异常,则代码正常执行,如果产生了异常,则中断当前执行代码,执行异常处理代码。
捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理
捕获异常格式:
try {
//需要被检测的语句。
}
catch(异常类 变量) { //参数。
//异常的处理语句。
}
finally {
//一定会被执行的语句。
}
try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
演示如下:
声明:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。
声明异常格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2… { }
例题
请使用代码实现
每一个学生(Student)都有学号,姓名和分数,分数永远不能为为负数
如果试图给学生赋值一个负数,抛出一个自定异常
public class Student {
private String name;
private int score;
private String id;
public Student(String name, int score, String id) throws StudentException {
super();
this.name = name;
if (score < 0) {
throw new StudentException("成绩不合法");
}
this.score = score;
this.id = id;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
public class StudentException extends Exception{
public StudentException() {
super();
// TODO Auto-generated constructor stub
}
public StudentException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
package Exercise01;
/*请使用代码实现
每一个学生(Student)都有学号,姓名和分数,分数永远不能为为负数
如果试图给学生赋值一个负数,抛出一个自定异常*/
public class Test {
public static void main(String[] args) {
try {
Student stu= new Student("小明", -11, "ID001");
} catch (StudentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//输出平台输出:
/* Exercise01.StudentException: 成绩不合法
at Exercise01.Student.(Student.java:11)
at Exercise01.Test.main(Test.java:10) */
}
}