异常体系:
Error:严重问题,不需要处理
Exception:称为异常类,表示程序本身可以处理的问题
- RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码
- 非RuntimeException:编译期就必须处理否则程序就不能通过编译。
如果程序出现了问题,我们没有做如何处理,最终JVM会默认的处理
异常处理如果程序出现了异常,我们需要自己来处理,有两种方案:
一、异常处理中之try…catch- 格式:
try {
可能出现异常的代码;
} catch(异常类 变量名) {
异常的处理代码;
}
执行流程:
程序从 try 里面的代码开始执行。
出现异常,会自动生成一个异常类对象,该异常对象将被提交给 java 运行时系统。
当 java 运行时系统接收到异常对象时,会到 catch 中去找匹配的异常类,找到后进行异常的处理。
执行完毕之后,程序还可以继续往下执行。
例:int 数组越界
System.out.println("开始");
try{
int[] arr = {1, 2, 3};
System.out.println(arr[3]);//越界
}catch(ArrayIndexOutOfBoundsException e){//异常类型
e.printStackTrace();//打印异常原因
}
//继续执行后续程序
System.out.println("结束");
输出:
开始 结束 java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at com.test1.Demo.main(Demo.java:10)Throwable 的成员方法
| 方法名 | 说明 |
|---|---|
| public String getMessage() | 返回 throwable 的详细消息字符串 |
| public String toString() | 返回此可抛出的简短描述 |
| public void printStackTrace() | 把异常的错误信息输出在控制台 |
- public String getMessage():
System.out.println("开始")
try{
int[] arr = {1, 2, 3};
System.out.println(arr[3]);//越界
}catch(ArrayIndexOutOfBoundsException e){//异常类型
System.out.println(e.getMessage());
}
System.out.println("结束");
输出:
开始 Index 3 out of bounds for length 3 结束
- 将getMessage()替换成 toString():
System.out.println(e.toString());
输出:
开始 java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 结束
- public void printStackTrace() 上面用到了。这个方法的信息是最全的,一般用这个。
所有的 RuntimeException 类及其子类被称为运行时异常,其他的异常都是编译时异常。
- 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
- 运行时异常:无需显示处理,也可以和编译时异常一样处理
格式:throws 异常类名;
注意:这个格式方法是跟在方法的括号后面的
- 编译时异常必须要进行处理,两种处理方法:try…catch…或者 throws,如果采用 throws 这种方案,将来谁调用谁处理
- 运行时异常可以不处理,出现问题后,需要我们回来修改代码
throws 只是把异常抛出,并不处理异常,异常的处理还是要 try…catch…
public class Demo {
public static void main(String[] args) {
System.out.println("开始");
try {//接收抛出的异常
method();
} catch (ParseException e) {
e.printStackTrace();//处理异常
}
System.out.println("结束");
}
//将异常抛出
public static void method() throws ParseException {//抛出对应的异常类型
String s = "2001-03-14";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = new Date();
d = sdf.parse(s);
System.out.println(d);//继续执行
}
}
自定义异常
格式:
public class 异常类名 extends Exception {
无参构造;
带参构造;
}
范例:
public class ScoreException extends Exception {
public ScoreException() {}
public ScoreException(String message){
super(message);
}
}
throw 和 throws 的区别
| throws | throw |
|---|---|
| 用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象名 |
| 表示抛出异常,由该方法的调用者来处理 | 表示抛出异常,由方法体内的语句处理 |
| 表示出现异常的一种可能性,并不一定会发生这些异常 | 执行 throw 一定抛出了某种异常 |
/继承Exception,重写构造方法
public class ScoreException extends Exception {
public ScoreException() {}
public ScoreException(String message){
super(message);
}
}
public class teacher {
public void checkScore(int score) throws ScoreException {//抛出异常
//判断分数是否在0~100之间
if(score < 0 || score > 100){
throw new ScoreException("你给的分数有误");//出现异常
}else{
System.out.println("分数正常");
}
}
}
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
//获得分数
Scanner s = new Scanner(System.in);
System.out.print("请输入分数:");
int score = s.nextInt();
//检测分数是否正常
teacher t = new teacher();
try {
t.checkScore(score);
} catch (ScoreException e) {//自定义的异常类型
e.printStackTrace();//处理异常
}
}
}
输出:
请输入分数:60 分数正常
请输入分数:111 com.test2.ScoreException: 你给的分数有误 at com.test2.teacher.checkScore(teacher.java:8) at com.test2.Demo.main(Demo.java:15)



