异常
-
概述
程序出现了不正常的情况
Error:严重问题,不需要处理
Exception:异常类,程序本身可以处理的问题。- RuntimeException:运行时异常(编译可以通过:可不处理,出现问题,修改代码)
- 非RuntimeExxception:编译时异常(编译不能通过:必须处理)
-
JVM默认异常处理
public class Demo { public static void main(String[] args) { System.out.println("开始"); Demo.method(); System.out.println("结束"); } //method()方法 public static void method(){ int[] i = {1,2,3}; System.out.println(i[3]); } } ---*--- 输出结果: 开始 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at com.testDemo14.Demo.method(Demo.java:12) at com.testDemo14.Demo.main(Demo.java:5)
如果程序出现了问题,但是没有做任何处理,JVM将会进行默认处理。
- 把异常的名称,异常原因及位置信息输出到控制台
- 终止程序
-
手动异常处理
-
try catch [finally] 语句:
try {
可能出现异常的代码;
} catch (异常类名 变量名) {
异常的处理代码;
} finally {
清理代码;
}public class Demo { public static void main(String[] args) { System.out.println("开始"); Demo.method(); System.out.println("结束"); } //method()方法 public static void method(){ try { int[] i = {1,2,3}; System.out.println(i[3]); } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); System.out.println("数组索引越界"); }finally { System.out.println("这里一定会被执行"); } } } ---*--- 输出结果: 开始 数组索引越界 这里一定会被执行 结束 java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at com.testDemo14.Demo.method(Demo.java:13) at com.testDemo14.Demo.main(Demo.java:5)
执行流程:执行 try 中代码,如果出现异常,生成一个异常类对象抛给Java运行时系统,当Java运行时系统接收到异常对象时,会到 catch 中找寻匹配的异常类,匹配到后赋值给 catch 中的异常变量然后进入 catch 块中对异常处理。异常处理完后程序可以继续执行。
-
throws 方法抛出异常
throws 用在方法括号后,用于声明该方法可能抛出的异常,方法的调用者来处理异常。仅仅只是抛出异常。public class Demo { public static void main(String[] args) { System.out.println("开始"); try { Demo.method2();//此方法抛出的解析异常需要在这里处理 } catch (ParseException e) { e.printStackTrace(); } System.out.println("结束"); } //method2()方法 --- 解析异常 public static void method2() throws ParseException{ String s = "2021-5-5*"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s);//抛出异常 System.out.println(d); } } ---*--- 输出结果: Wed May 05 00:00:00 CST 2021
上面代码中 sdf.parse(s); 会抛出一个解析异常(ParseException),该异常是编译时异常,需要处理否则编译不能通过。或者也可以在方法上声明此方法会抛出一个解析异常,让方法调用者去处理。
-
自定义异常类
public class 自定义异常类名 extends Exception {
无参构造
带参构造
}public class Demo2 { public static void main(String[] args) { System.out.println("开始"); Scanner sc = new Scanner(System.in); System.out.println("请输入分数:"); int a = sc.nextInt(); try { Tether.scor(a); } catch (MyException e) { e.printStackTrace(); } System.out.println("结束"); } } //分数判断类 class Teather { public static void scor (int i) throws MyException{ //分数不合法会抛出异常 if (i<0 || i>100){ throw new MyException("异常原因:分数只能在0 ~ 100之间"); }else { System.out.println("分数合法"); } } } //自定义异常类 class MyException extends Exception{ public MyException(){} public MyException(String message){ super(message); } } ---*--- 输出结果: 开始 请输入分数: 105 com.testDemo14.MyException: 异常原因:分数只能在0 ~ 100之间 at com.testDemo14.Teather.scor(Demo2.java:27) at com.testDemo14.Demo2.main(Demo2.java:14) 结束
在使用自定义异常类的时候,出现我们认为不合法的地方,需要用 throw关键字 手动将异常抛出。下面说一下 throw 和 throws 的区别
throws throw 用在方法声明后,throws Exception(跟类名) 用在方法体内,throw new MyException(跟对象) 仅抛出,谁用谁处理 产生异常,方法内处理 有可能出现异常 一定出现了异常 -