219 自定义异常
> 为什么要学习自定义异常?——因为实际工作中,有些情况不是Java定义的异常,但开发者需要把它们定义为异常。比如学习成绩不应该是负数
【代码操作思路】
在idea里按ctrl n,搜‘NullPointException’
public class NullPointerException extends RuntimeException
接着搜‘ParseException’
public class ParseException extends Exception
总结,继承RuntimeException类或Exception类的,可以自定义异常
【自定义异常 的 格式】
public class 异常类名 extends Exception{
无参构造
带参构造
}
例如
pubilc class ScoreException extends Exception{
public ScoreException(){}
public ScoreException(String message){}
super(message);
}
【代码书写思路】
又,ctrl f查找出现detailMessage的地方,一共6处,第一处是声明这个成员变量,其他是传值给它的
private String detailMessage;
【throws和throw的区别】
throws |
throw |
用在方法声明后面,跟异常类名 表示抛出异常,由方法的调用者做实际处理 可能有异常,可能没异常 |
用在方法体内,后面跟异常对象名 表示抛出异常,在当前的方法体内进行处理 必定有异常 |
--------------------------------------------------------------
(module)myException
(package)it05e219
(class)ScoreException,Teacher,TeacherTest
--------------------------------------------------------------
package e219;
public class ScoreException extends Exception{
public ScoreException() {
}
public ScoreException(String message, Throwable cause) {
super(message);
}
//然后把message传给父类Exception,
// 经过Java源代码的层层传递,message最终传给detailMessage
//这样做,后面就可以使用getMessage方法获取message???
}
--------------------------------------------------------------
package e219;
import java.util.Scanner;
public class Teacher {
public void checkScore(int score) throws ScoreException{
if(score<0 || score>100){
//手动抛出异常
throw new ScoreException();
}else{
System.out.println("219/the score is ok.");
}
}
}
--------------------------------------------------------------
package e219;
import java.util.Scanner;
public class TeacherTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("219/what's the score?");
int score = sc.nextInt();//ATTENTION:nextInt() instead of nextLine()
Teacher t = new Teacher();//创建Teacher对象以调用Teacher的方法checkScore
try{
t.checkScore(score);
}catch(ScoreException se){
se.printStackTrace();
System.out.println("wrong format of score");
}
}
}