Java中有三种异常:
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 检查性异常就是我们的工具会指出这个地方可能有错误。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
package com.shiro.springbootshiro.exception; /** * 作用:异常的学习 */ public class Exception1 { public static void main(String[] args) { //int i=1/0; //System.out.println(i); //抛出ArithmeticException 它的父类是:RuntimeException 是运行时异常 int[] a = {3,4,2,1}; try { System.out.println(a[4]); }catch (ArrayIndexOutOfBoundsException e){ //捕获到了下标越界异常。 System.out.println("捕获到了异常"); e.printStackTrace(); } } }
throws:
package com.shiro.springbootshiro.exception; /** * 作用:异常的学习 */ public class Exception1 { public static void main(String[] args) { Exception1.exception1(); } public static void exception1() throws ArrayIndexOutOfBoundsException{ int[] a={1,2,3}; System.out.println(a[3]); } }
输出:
throws是这个方法有可能会抛出异常。用来提高程序的健壮性。
我们看下这个例子:
package com.shiro.springbootshiro.exception; /** * 作用:异常的学习 */ public class Exception1 { public static void main(String[] args) { try{ int i = 100/ 0; System.out.print(i); }catch(Exception e){ System.out.print(1); e.printStackTrace(); // throw new RuntimeException(); }finally{ System.out.print(2); } System.out.print(3); } }
输出的结果:
//e.printStackTrace(); throw new RuntimeException();
输出:
首先执行try,遇到算术异常,抛出,执行catch,打印1,然后抛出RuntimeException,缓存异常,执行finally,打印2,然后抛出RuntimeException。
try catch是直接处理,处理完成之后程序继续往下执行,throw则是将异常抛给它的上一级处理,程序便不往下执行了。
自定义异常:
如果是一个检查性异常,就继承Exception
如果是一个运行时异常,就继承RuntimeException .
为什么要自定义异常呢。假如我们的业务中我们认为的是异常,但是Java中没有,这个时候就要我们自己来编写异常
假如我们认为:中性是异常。
package com.shiro.springbootshiro.exception; /** * 作用:自定义异常 */ public class MyException extends Exception { public MyException(String message) { super(message); } }
package com.shiro.springbootshiro.exception; /** * 作用:异常的学习 */ public class Exception1 { public static void main(String[] args) throws MyException { String[] sexs = {"男性","女性","中性"}; for(int i = 0; i < sexs.length; i++){ if("中性".equals(sexs[i])){ throw new MyException("你全家都是中性!"); }else{ System.out.println(sexs[i]); } } } }
输出:
什么时候不知晓finally
package com.shiro.springbootshiro.exception; /** * 作用:异常的学习 */ public class Exception1 { public static void main(String[] args) throws MyException { try { int i = 1 / 0; } catch (Exception e) { e.printStackTrace(); System.exit(0); //return; }finally { System.out.println("执行了finally"); } } }
如果是return的话,还是会执行finally里的代码,只有当退出JVM的时候,才不会执行。