我们在上一篇文章中,对java中的异常有了一个初步的了解,本篇文章我们来了解一下异常的处理机制,如何抛出异常,如何捕捉异常
关于java的异常
1、我们新建一个测试类,在里面声明两个变量a和b,a=1,b=0,输出a/b(我们知道这是错误的,所以要做异常处理)。
package exception;
public class Demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
System.out.println(a/b);
}
}
我们输出一下,发现这是ArithmeticException类型的异常(算术异常)
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exception.Demo01.main(Demo01.java:8)
2、我们用try catch做一下异常处理,(fianlly可以不用,但是我们后期学习IO流的时候,要把资源关闭,可以理解为scanne.close)
package exception;
public class Demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
try //监控区域
{
System.out.println(a/b);
}catch (ArithmeticException e)//捕获异常
{
System.out.println("程序出现异常,变量b不能为0");
}finally//处理善后工作
{
System.out.println("finally");
}
}
}
try//异常监控
{
//需要监控的代码
}
catch()//异常类型捕获
{
//捕捉后执行的代码
}
1、我们做了异常处理以后,再执行一下代码,就会看到输出的是我们捕捉后进行处理的代码了。
程序出现异常,变量b不能为0
finally
2、我们再来定义两个方法,让他们互相调用。
package exception;
import struct.Test;
public class Demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
try //监控区域
{
new Demo01().a();
}catch (ArithmeticException e)//捕获异常
{
System.out.println("不能互相调用!");
}finally//处理善后工作
{
System.out.println("finally");
}
}
public void a(){b();}
public void b(){a();}
}
3、我们执行以下代码,发现输出了finally,但是并没有捕捉到异常。
finally
Exception in thread "main" java.lang.StackOverflowError
at exception.Demo01.b(Demo01.java:22)
at exception.Demo01.a(Demo01.java:21)
at exception.Demo01.b(Demo01.java:22)
at exception.Demo01.a(Demo01.java:21)
package exception;
import struct.Test;
public class Demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
try //监控区域
{
new Demo01().a();
}catch (Throwable e)//捕获异常
{
System.out.println("不能互相调用!");
}finally//处理善后工作
{
System.out.println("finally");
}
}
public void a(){b();}
public void b(){a();}
}
4、catch可以是多个,有点类似else if 满足其中一个就可以,所以要把最大的写在最后,如果写在前面的话,后面的异常处理就不执行了
try//异常监控
{
//需要监控的代码
}
catch(Error e)//异常类型捕获
{
//捕捉后执行的代码
}
catch(Exception e)//Exception相对大一点
{
}
.....
catch(Throwable e)//最大的写在最后
{
}
package exception;
public class Demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
System.out.println(a/b);//选中,CTRL+ALT+T
}
}
package exception;
public class Demo02 {
public static void main(String[] args) {
int a=1;
int b=0;
try {
System.out.println(a/b);
} catch (Exception e) {
throw new RuntimeException(e);//打印错误信息
}
}
}
package exception;
public class Demo02 {
public static void main(String[] args) {
int a=1;
int b=0;
try
{
System.out.println(a/b);
}
catch (Exception e)
{
System.exit(1);//结束程序
throw new RuntimeException(e);
}
}
}
二者的区别还是非常大的。
有时候我们知道代码中逻辑会有问题,所以我们选择去主动抛出异常,我们先来看一下throw。
package exception;
public class Demo02 {
public static void main(String[] args) {
int a=1;
int b=0;
try
{
if (b==0)
{
throw new ArithmeticException();//主动抛出异常
}
System.out.println(a/b);
}
catch (Exception e)
{
//System.exit(1);
throw new RuntimeException(e);
}
}
}
我们写一个除数的方法。
public void test(int a,int b)
{
if (b==0)
{
throw new ArithmeticException();//主动抛出异常
}
System.out.println(a/b);
}
我们在上面调用以下这个方法,运行以下,就会抛出异常。
package exception;
public class Demo02 {
public static void main(String[] args) {
new Demo02().test(1,0);
}
}
Exception in thread "main" java.lang.RuntimeException: java.lang.ArithmeticException
at exception.Demo02.main(Demo02.java:18)
public void test(int a,int b) throws ArithmeticException
{
if (b==0)
{
throw new ArithmeticException();//主动抛出异常
}
System.out.println(a/b);
}
这里我们调用的时候,用try catch 捕获一下。
package exception;
public class Demo02 {
public static void main(String[] args) {
try {
new Demo03().test(1,0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
捕捉的好处,就是如果不捕获异常的话,程序碰到异常就直接终止了,但是捕获了以后,还是可以继续运行的,所以异常捕获十分的重要!