Java基础——异常处理

2017-06-18  本文已影响102人  阿敏其人

异常,说起来,就是一张图,5个关键字。

一张图

image.png

5个关键字

Java的异常捕获机制是怎么处理异常的?
要出捕获,要么抛出


一、异常

异常是程序运行过程中出现的错误。
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的父类。

异常主要分类两类,一类是 Error,另一类是 Exception
Exception有两个子类,一个是 RuntimeException,另一种是 非运行时异常,比如IOException。

接下来就说说说上面出现的这几个东西

二、5个关键字

Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws。

我们先来看一下

    try{       
        //(尝试运行的)程序代码     
        }catch(异常类型 异常的变量名){       
            //异常处理代码     
        }
        // finally 不是必须的
        finally{       
            //异常发生,方法返回之前,总是要执行的代码     
        }
    }

1、try

try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。

2、catch

通过异常对象可以获取异常发生时完整的 JVM堆栈信息,以及异常信息和异常发生的原因等。

3、finally

finally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常

比如我们tr……catch IO输入输出的异常,那么我们可以在finally里面把流给关闭。

目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性。

示例代码1 运行时异常
我们先来看一段代码,用0做除数,会抛异常

public class ThrowableTest {
    public static void main(String[] args) {    
        int a = 3;
        int b = 0;
        // 0如果做除数会抛异常
        System.out.println("result: "+a/b);
    }
}

运行抛会异常

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at TrowTest.ThrowableTest.main(ThrowableTest.java:8)

这里抛出的异常是运行时异常,在编译的时候不会出现。必须我们程序员自己在编码做预防处理,比如用异常捕获机制try……catch
.
.
示例代码2 异常捕获机制

public class ThrowableTest {
    public static void main(String[] args) {    
        int a = 3;
        int b = 0;
        try {
            // 0如果做除数会抛异常
            System.out.println("result: " + a / b);
        } catch (Exception e) {
            System.out.println("捕获到异常: " + e.toString());
        }
    }
}

运行结果:

捕获到异常: java.lang.ArithmeticException: / by zero

异常被我们捕获了,程序没奔溃,正常运行。

.
.

try,catch和finally的使用注意点

throws

throws表示什么

throws什么时候用呢

throw

throw关键字是用于方法体内部(语句抛出),用来抛出一个Throwable类型的异常。

.
.

示例代码 throws

public class Test {
    static String abc = null;
    public static void main(String[] args) {
        try {// 因为show() throws Exception,所以调用者 try……catch,不然编译不通过
            show(abc);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static void show(String s) throws Exception{
        //这句代码会引发 java.lang.NullPointerException
        s.toString(); 
        
    }
}

输出

java.lang.NullPointerException
    at TrowTest.Test.show(Test.java:14)
    at TrowTest.Test.main(Test.java:7)

如上,我们在show方法 throws Exceptionthrows Exception了,所以调用者就艺try……catch
.
.

代理示例 throw 出 运行时异常

public class ThrowableTest {
    public static void main(String[] args) {
        int a = 3;
        int b = 0;
        System.out.println("result:  "+divisionNum(a, b));
    }
    
    private static  int divisionNum(int n1,int n2){
        try {
            if (n2 == 0) {
                throw new ArithmeticException("在方法内的语句 throw 抛出运行时异常");
            } 
        } catch (Exception e) {
            System.out.println("捕获异常  "+e.toString());
        }
        return n1/n2;
    }
}

运行结果,运行失败抛异常

Exception in thread "main" 捕获异常  java.lang.ArithmeticException: 在方法内的语句 throw 抛出运行时异常
java.lang.ArithmeticException: / by zero
    at TrowTest.ThrowableTest.divisionNum(ThrowableTest.java:18)
    at TrowTest.ThrowableTest.main(ThrowableTest.java:7)


.
.

自定义异常

ToMinException

public class ToMinException extends Exception {
    public ToMinException(String msg)  
    {  
        super(msg);  
    }  
}

.
.
ToMaxException

public class ToMaxException extends Exception {
    public ToMaxException(String msg)  
    {  
        super(msg);  
    }  
}

.
.
Test

public class Test {
    
    public static void main(String[] args) {
        Test test = new Test();
        try {
            test.simpleAdd10to20(8, 17);
        } catch (ToMinException e) {
            e.printStackTrace();
            System.out.println("捕获到的异常信息  toString()   :"+e.toString());
            System.out.println("捕获到的异常信息:getMessage()  "+e.getMessage());
        }catch(ToMaxException e){
            e.printStackTrace();
            System.out.println("捕获到的异常信息  toString()   :"+e.toString());
            System.out.println("捕获到的异常信息:getMessage()  "+e.getMessage());
        }
        
        //getMessage() //输出异常的信息 
        // printStackTrace() //输出导致异常更为详细的信息 
        
    }
    
    // 这个方法只允许大于10,和小于20的数字,我们违反规则的数抛异常(仅为演示)
    private int simpleAdd10to20(int a,int b) throws ToMinException,ToMaxException{
        if(a>10 || b>10){
            throw new ToMinException("不能有小于10 的参数");
        }
        
        if(a>20 || b>20){
            throw new ToMaxException("不能有大于20 的参数");
        }
        return a+b;
    }
}

输出:

TrowTest.ToMinException: 不能有小于10 的参数
    at TrowTest.Test.simpleAdd10to20(Test.java:27)
    at TrowTest.Test.main(Test.java:8)
捕获到的异常信息  toString()   :TrowTest.ToMinException: 不能有小于10 的参数
捕获到的异常信息:getMessage()  不能有小于10 的参数

以上演示完自定义异常了。

最后我们顺便说一下几个关于异常的方法:
e.printStackTrace();
是打印异常的堆栈信息,指明错误原因,其实当发生异常时,通常要处理异常,这是编程的好习惯,所以e.printStackTrace()可以方便你调试程序!

e.toString()
具体哪个异常类哪个方法,具体异常提示是什么

e.getMessage()
最简要的异常内容提示

上一篇下一篇

猜你喜欢

热点阅读