JVM的默认处理方案
如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理:
- 把异常的名称,异常原因及异常出现的位置等信息输出在控制台
- 程序停止执行
自行处理方案
如果程序出现了问题,我们需要自己来处理,有三种方案:
- try……catch……
- throw
- throws
自行处理后,程序可继续执行。
try……catch……
-
格式:
-
执行流程:
- 程序从try里面的代码开始执行
- 出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统
- 当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
- 执行完毕后,程序还可以继续往下执行
-
快捷键:Ctrl+Alt+T
-
举例:
捕获单个异常:
package com.exception; public class Test { public static void main(String[] args) { int a=1; int b=0; try { //try监控区域 System.out.println(a/b); }catch (ArithmeticException c){ //catch捕获异常 System.out.println("程序出现异常,变量b不能为0"); }finally { //处理善后工作,例如:scanner.close() System.out.println("finally"); } } }
假设要捕获多个异常,catch内的异常变量应从小范围到大范围,否则会发生覆盖:
package com.exception; public class Test { public static void main(String[] args) { int a=1; int b=0; try { System.out.println(a/b); } catch (Error e) { System.out.println("Error"); e.printStackTrace(); } catch (Exception e) { System.out.println("Exception"); e.printStackTrace(); //打印栈信息(异常信息) } catch (Throwable e) { System.out.println("Throwable"); e.printStackTrace(); } finally { System.out.println("finally"); } } }
throw
-
概述:
throw:主动抛出异常,一般在方法中使用,在这里只是抛出异常,并不对异常做处理
-
举例:
package com.exception; public class Test { public static void main(String[] args) { new Test().test(1,0); } public void test(int a,int b){ if (b==0){ throw new ArithmeticException(); //主动抛出异常,一般在方法中使用 } } }
throws
-
概述:
throws用来声明一个方法可能产生的异常,不做任何处理,而是将异常往上传,谁调用就抛给谁
-
举例:
-
运行时异常:
package com.exception; public class Test2 { public static void main(String[] args) { method(); } //运行时异常 public static void method() throws ArrayIndexOutOfBoundsException{ int[] arr={1,2,3}; System.out.println(arr[3]); //ArrayIndexOutOfBoundsException } }
-
编译时异常:
package com.exception; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test3 { 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="2048-08-09"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s); System.out.println(d); } }
-
-
注意:
- 编译时异常必须要进行处理,两种处理方案:try……catch……或者throws,如果采用throws这种方案,将来谁调用谁处理
- 运行时异常可以不处理,出现问题后,则需要我们回来修改代码
throw和throws的联系和区别
-
联系:
throw和throws都只是抛出一个异常,并未对异常做出处理,如果要做处理还需要用到try……catch……,这样程序才能不受异常的影响,继续执行下去。
-
区别:
throws throw 用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁 用来抛出一个具体的异常类型 用在方法声明后面,跟的是异常类名 用在方法体内,跟的是异常对象名 可以跟多个异常类名,用逗号隔开 只能抛出一个异常对象名 表示抛出异常,由该方法的调用者来处理 表示抛出异常,由方法体内的语句处理 表示出现异常的一种可能性,并不一定会发生这些异常 一定抛出了某种异常 处理异常:调用者通过 try-catch捕获并处理此异常,或者调用者继续声明此异常。注意:到了main方法仍在继续声明异常的话,则此异常最后将交于JVM处理 处理异常:在抛出异常处,通过 try-catch捕获并处理此异常,或者抛出一个异常(throws 异常)
重要声明:本篇文章整理自B站狂神说Java、黑马程序员全套Java教程
参考文章:https://blog.csdn.net/weixin_38011265/article/details/79149313