-
异常概述
异常:就是程序出现了不正常的情况
-
异常体系
Error:严重问题,不需要处理
Exception:称为异常,它表示程序本身可以处理的问题
- RuntimeException:在编译期间是不检查的,出问题后,需要我们回来修改代码。
- 非RuntimelyException:在编译期间必须处理,否则程序不能通过编译,就更不能正常运行了。
注:JVM(Java Virtual Machine,Java虚拟机)
package study06;
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method(){
int [] arr = {1,2,3};
// System.out.println(arr[1]);
System.out.println(arr[3]);
}
}
- 如果程序出现了问题,我们没有做任何处理,最终JVM会做默认处理
- 把异常名称,异常的原因及异常出现的位置等信息输出在了控制台。
- 程序终止执行
如果程序出现了问题,我们需要自己来处理,有两种方案:
- try……catch
- throws
- 格式
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
- 执行流程:
程序从try里面的代码开始执行
出现异常,会自动生成一个异常类对象,该异常对象会被提交给Java运行时系统
当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
执行完毕之后,程序还可以继续往下执行。
- 示例代码
package study06;
public class ExceptionDemo1 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method(){
try {
int [] arr = {1,2,3};
System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
// System.out.println("你访问的数组索引不存在");
e.printStackTrace();
}
}
}
2. Throwable的成员方法
- 成员方法
| 方法名 | 说明 |
|---|---|
| public String getMessage() | 返回此throwable的详细消息字符串 |
| public String toString() | 返回此可抛出的简短描述 |
| public void printStackTrace() | 把异常的错误信息输出在控制台 |
- 示例代码
package study06;
//| `public String getMessage()` | 返回此throwable的详细消息字符串 |
//| `public String toString()` | 返回此可抛出的简短描述 |
//| `public void printStackTrace()` | 把异常的错误信息输出在控制台 |
public class ExceptionDemo2 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method(){
try {
int [] arr = {1,2,3};
System.out.println(arr[9]);//new ArrayIndexOutOfBoundsException();
}catch (ArrayIndexOutOfBoundsException e){
// | `public void printStackTrace()` | 把异常的错误信息输出在控制台 |
e.printStackTrace();
// | `public String getMessage()` | 返回此throwable的详细消息字符串 |
// System.out.println(e.getMessage());//9
// | `public String toString()` | 返回此可抛出的简短描述 |
// System.out.println(e.toString());
}
}
}
4.编译时异常和运行时异常的区别
Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常。
所有的RuntimeException类及其子类被称为运行时异常,其他的都是编译时异常。
- 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译。——有可能出问题
- 运行时异常:无需显示处理,也可以和编译时异常一样处理。
代码示例:
package study06;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo3 {
public static void main(String[] args) throws ParseException {
System.out.println("开始");
method1();
method2();
method3();
System.out.println("结束");
}
// 编译时异常——throws方法处理异常
public static void method1() throws ParseException {
String s = "2021-11-11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
// 编译时异常——try{}catch(){}方法处理异常
public static void method2(){
try {
String s = "2021-11-11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
Date d = sdf.parse(s);
System.out.println(d);
}catch (ParseException E){
E.printStackTrace();
}
}
// 运行时异常
public static void method3(){
try {
int []arr={1,2,3};
System.out.println(arr[3]);//ArrayIndexOutOfBoundsException
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
}
}
5.异常处理之throws
虽然我们通过try……catch……可以对异常进行处理,但是并不是所有的情况我们都有权限进行异常的处理;也就是说,有些时候可能出现的异常我们是处理不了的,针对这种情况,Java提供了throws的处理方案。
- 格式
throws 异常类名;
注意:这个格式是跟在方法的括号后面的
- 编译时异常必须要进行处理,两种方案:try……catch……或者throws,如果采用throws这种方案,将来谁调用谁处理。
- 运行时异常可以不处理,出现问题后,需要我们回来修改代码。
示例代码:
package study06;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo4 {
public static void main(String[] args) {
System.out.println("开始");
try {
method1();
} catch (ParseException e) {
e.printStackTrace();
}
method2();
method3();
System.out.println("结束");
}
// 编译时异常——throws方法处理异常
public static void method1() throws ParseException {
String s = "2021-12-11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
// 编译时异常——try{}catch(){}方法处理异常
public static void method2(){
try {
String s = "2021-11-11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
Date d = sdf.parse(s);
System.out.println(d);
}catch (ParseException E){
E.printStackTrace();
}
}
// 运行时异常
public static void method3(){
try {
int []arr={1,2,3};
System.out.println(arr[3]);//ArrayIndexOutOfBoundsException
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
}
}
6.自定义异常
-
格式
public class 异常类名 extends Exception{ 无参构造; 带参构造; } -
范例
public class ScoreException extends Exception{
public ScoreException(){}
public ScoreException(String message){
super(message);
}
}
- 示例代码
- 自定义异常
package study07;
public class ScoreException extends Exception{
public ScoreException(){}
public ScoreException(String message){
super(message);
}
}
- 老师类
package study07;
public class teacher {
public void checkScore(int score) throws ScoreException {
if(score<0||score>100){
// throw new ScoreException();
throw new ScoreException("你给的分数有误,请保持分数在0-100之间");
}else {
System.out.println("分数正常");
}
}
}
- 测试类
package study07;
import java.util.Scanner;
public class teacherDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数");
int score = sc.nextInt();
teacher t = new teacher();
try {
t.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}
- throws和throw的区别
| throws | throw |
|---|---|
| 用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象名 |
| 表示抛出异常,由该方法的调用者来处理 | 表示抛出异常,由方法体内的语句处理 |
| 表示出现异常的一种可能性,并不一定会发生这些异常 | 执行throw一定跑出了某种异常 |
rows和throw`的区别
| throws | throw |
|---|---|
| 用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象名 |
| 表示抛出异常,由该方法的调用者来处理 | 表示抛出异常,由方法体内的语句处理 |
| 表示出现异常的一种可能性,并不一定会发生这些异常 | 执行throw一定跑出了某种异常 |



