day14 异常
1、ArrayIndexOutOfBoundsException
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQp3TtLp-1631584683815)(image\12、异常体系.png)]
2、JVM的默认处理方案
- 把异常的名称,异常原因以及出现的位置等信息输出在了控制台
- 出现停止执行
3、异常处理
如果程序出现了问题,我们需要自己来处理,有两种方案:
-
try-----catch
try{ 可能出现异常的代码 }catch(异常类名 变量名){ 异常处理代码 }
执行流程:
1、程序从try里面的代码开始执行
2、出现异常,会自动生成一个异常类对象,该异常对象将被提交给java运行时系统
3、当java运行时系统接收到异常对象时,会到cath中去找匹配的异常类,找到运行异常的处理执行完毕之后,出现还可以继续往下执行
package com.zcl.ExceptionDemo01; public class ExceptionDemo { public static void main(String[] args) { System.out.println("开始"); method(); System.out.println("结束"); } public static void method(){ // try---catch 异常处理 try{ int[] arr = {1,2,3}; System.out.println(arr[3]); }catch (ArrayIndexOutOfBoundsException e){ // new // System.out.println("您访问的数组索引不存在"); e.printStackTrace(); // 调用方法输出异常信息 } /* 异常处理输出 开始 您访问的数组索引不存在 结束 */ } } /** 异常报告 * 开始 * Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 * at com.zcl.ExceptionDemo01.ExceptionDemo.method(ExceptionDemo.java:11) * at com.zcl.ExceptionDemo01.ExceptionDemo.main(ExceptionDemo.java:6) */
Throwable的成员方法
方法名 说明 public String getMessage() 返回此throwable的详细消息字符串 public String toString() 返回此可抛出的简短描述 public void printStackTrace() 把异常的错误输出在控制台 编译时异常和运行时异常的区别
java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常
所有的RuntimeException类以及子类被称为运行时的异常,其他的异常都是编译时异常
- 编译时异常:必须显示处理,否则出现就会发送错误,无法通过编译
- 运行时异常:无需显示处理,也可以和编译时的异常一样处理
package com.zcl.Demo; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo { public static void main(String[] args) { // method(); 运行时异常 method2(); } // 编译时异常 public static void method2(){ try { String s = "2048-08-08"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s); System.out.println(d); } catch(ParseException e){ e.printStackTrace(); } } //运行时异常 ArrayIndexOutOfBoundsException public static void method(){ try { int[] arr = {1,2,3}; System.out.println(arr[3]); }catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace(); } } }
-
throws
格式
throws 异常类名;
注意:这个格式是跟在方法的括号后面的
package com.zcl.Demo2;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
throws 异常类名
*/
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
// method();
/*
通过快捷键:Alt+Ent可以快速选择处理方案
*/
try {
method2();
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("结束");
}
// 编译时异常
public static void method2() throws ParseException {
String s = "2048-08-08";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
//运行时异常 ArrayIndexOutOfBoundsException
public static void method() throws ArrayIndexOutOfBoundsException{
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
}
- 编译时异常必须要进行处理:两种处理方案:try…catch或者throws,如果采用throws这种方案,将来谁调用谁处理
- 运行时异常可以不处理:出现问题后,需要我们回来修改代码
4、自定义异常
格式
public class 异常类名 extends Exception {
无参构造
带参构造
}
案例:
自定义异常
package com.zcl.Demo3;
public class ScaoreException extends Exception{
public ScaoreException(){}; // 无参构造
public ScaoreException(String message){
super(message);
};
}
创建老师类
package com.zcl.Demo3;
public class Teacher {
// throws ScaoreException就不会报错了
public void checkScre(int score) throws ScaoreException{
if(score<0||score>100){
// 产生异常对象,抛出去
// throw 方法体内部的抛出异常对象的
// throw new ScaoreException(); // 无参
throw new ScaoreException("您给的分数有误,分数应该在0-100之间!"); // 带参
}else {
System.out.println("分数正常");
}
}
}
测试类
package com.zcl.Demo3;
import java.util.Scanner;
public class Demo {
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.checkScre(score);
} catch (ScaoreException e) {
e.printStackTrace();
}
}
/*
请输入分数:
120
com.zcl.Demo3.ScaoreException: 您给的分数有误,分数应该在0-100之间!
at com.zcl.Demo3.Teacher.checkScre(Teacher.java:10)
at com.zcl.Demo3.Demo.main(Demo.java:13)
*/
}
throws和thow的区别
throws:
- 用在方法声明后面,跟的是异常类名
- 表示抛出异常,由该方法的调用者来处理
- 表示抛出异常的一种可能性,并不一定会发生这些异常
throw:
- 用在方法体内,跟的是异常对象名
- 表示抛出异常,由方法体内的语句处理
- 执行throw一定抛出了某种异常