- try //监视区域,先做监视观察 才能去捕获
- catch //捕获异常
- finally //无论怎么样 最终都要去做的事(善后工作)
- throw //抛出异常(非常确定抛出的是什么异常,只是没有做异常的声明)
- throws //在方法头上 书写(意味着该方法可能会抛出这些异常!这叫做异常的声明)
正常 a/b 肯定会 提示你 异常。
那么 我们怎么 去捕获这个异常,并且获得一些 信息呢?
- 首先 要监视它的所有行为!用 try 来监视!
- 用 catch 去捕获 它 异常的地方!这个异常的地方我们可以自己定义时什么异常,比如说 ArithmeticException 算术异常。
catch(ArithmeticException e) //意思就是 说 当 我监视你整体的行为中,如果出现了 算术异常,那么我就将这个异常捕获下来!- finally:就是做善后工作,出不出现异常,都要执行!所以可有可无。
package 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 e) { System.out.println("出现异常!变量b不能为0,分母不能为0!"); }finally { System.out.println("无论出不出现异常,我都得执行!"); } } }
可以使用 Throwable 这个最大的 异常类型 进行捕获!
- 如果你知道你捕获的肯定是异常 也可以用 Exception
- 如果你知道你不活的肯定是错误 也可以用 Error
package 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 e) { System.out.println("出现异常!变量b不能为0,分母不能为0!"); }finally { System.out.println("无论出不出现异常,我都得执行!"); } try{ new Test().a(); }catch(Throwable e) { System.out.println("栈溢出"); } } public void a() { b(); } public void b(){ a(); } }
可以通过 层次 捕获(捕获优先级) ,多次 判断,来确定是 异常 还是 错误!
Throwable > Exception > Error (捕获优先级)
例如:捕获栈溢出 是 error 还是 exception
package 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 e) { System.out.println("出现异常!变量b不能为0,分母不能为0!"); }finally { System.out.println("无论出不出现异常,我都得执行!"); } //层次捕获 从低到高,如果从高到低,那么直接就捕获结束了! try{ new Test().a(); }catch(Error e) { System.out.println("error"); }catch(Exception e) { System.out.println("exception"); }catch(Throwable e) { System.out.println("栈溢出"); } } public void a() { b(); } public void b(){ a(); } }
事实证明,栈溢出 属于 error 错误 范畴,是 一个很严重的 错误!并非 异常 可比!
Ctrl+Alt+T 直接就会 让你选择 用什么结构 包含这行代码。
e 是捕获到后该异常后,给你提供的 该异常类型的对象,这个对象有很多的方法!是Java 为你提供的,只是为了方便 你 开发程序,所以 Java 为你提供了 这么一个东西!
throw / throws 常常用于 方法中!而并非 随便挑选出来的某个代码块中。
throw 只能抛出一个异常,并且不会自动做 异常的声明,所谓异常的声明,所谓异常的声明就是用 throws 在 方法头部 那里 告诉外部 我这个方法可能会抛出哪些异常!
package Exception; public class Throw { public static void main(String[] args) { new Throw().f(2,0); } public int f(int a,int b) { if( b == 0) { throw new ArithmeticException();//抛出一个 算术异常对象 } int ret = 0; //int ret = a / b; return ret; } }
一旦抛出了异常,你就会发现 我们需要 catch 抓捕下来 并且 进行处理!
throws 作为 方法 可能抛出 异常的声明!
简单了解下就行,就是 为 可能抛出的异常 做声明!而 方法体内,要在 特定的情况下,抛出这些异常,以便于 我们进行 捕获 和 处理!