9.2 捕获和抛出异常
- 抛出异常
- 捕获异常
- 异常处理的五个关键字
- try //监视区域,先做监视观察 才能去捕获
- catch //捕获异常
- finally //无论怎么样 最终都要去做的事(善后工作)
- throw //抛出异常(非常确定抛出的是什么异常,只是没有做异常的声明)
- throws //在方法头上 书写(意味着该方法可能会抛出这些异常!这叫做异常的声明)
如果该方法在方法体内 完成了对其中一个异常的处理,那么这个被处理的异常!就可以不用写在 方法头上了!因为该异常不需要向外抛出,该方法自己已经解决了!
9.2.1 举例说明
正常 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("无论出不出现异常,我都得执行!");
}
}
}
9.2.2 当我们不知道 需要捕获什么异常的时候怎么办呢?
可以使用 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 错误 范畴,是 一个很严重的 错误!并非 异常 可比!
- IDEA 自动包含代码快捷键
Ctrl+Alt+T 直接就会 让你选择 用什么结构 包含这行代码。
9.2.3 捕获到后的 e 对象
e 是捕获到后该异常后,给你提供的 该异常类型的对象,这个对象有很多的方法!是Java 为你提供的,只是为了方便 你 开发程序,所以 Java 为你提供了 这么一个东西!
9.2.4 主动抛出异常(throw/throws)
throw / throws 常常用于 方法中!而并非 随便挑选出来的某个代码块中。
9.2.4.1 throw
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 抓捕下来 并且 进行处理!
9.2.4.2 throws
throws 作为 方法 可能抛出 异常的声明!
简单了解下就行,就是 为 可能抛出的异常 做声明!而 方法体内,要在 特定的情况下,抛出这些异常,以便于 我们进行 捕获 和 处理!