第十二章 迷迷糊糊的异常(一)

一、异常基本概念简介

1、“异常”的理解

异常和语法错误是不一样的,语法错误程序会马上又小红点,但是异常是可能会发生的不一定发生的“不好的事情”。

2、Java的异常机制

Java异常使用终止模型,即假设“不好的事情”非常非常“关键,一旦发生“不好的事情”,就不可以在回到异常抛出点继续执行。

Java异常:就是把“不好的事情”相关的信息进行报告。

java异常处理程序将程序从不好的状态中恢复,前提是这个“不好的状态可以恢复”。

3、异常的分类

从继承关系上分:

Throwable类有两子类:Error类 ,以及Exception类

Exception类的子类分为:RuntimeException类,和非RuntimeException类

Error类:用于JVM报告系统错误,和程序代码无关。例如,OutOfMemoryError(内存溢出)。此类一般不需要编码人员关心。

Exception类: ①RuntimeException类:很难预料、一个地方发生RuntimeException,往往会在另外一个地方发生错误。                                           RuntimeException所代表的就是编程错误,逻辑错误。由于编程错误,所以不应该对其捕获。

       例如,NullPointerException(空指针),ArrayIndexOutOfBoundsException(数组下标越界)

    ②非RuntimeException类:需要捕获进行异常处理从不好的状态中恢复。例如,IOException,FileNotFoundException。        

 

从编译器是否强制检查分:

被检查异常:包括所有非RuntimeException类,这些异常受编译器强制检查。即一旦抛出,要么try-catch捕获处理,要么throws进行声明

不被检查异常:包括RuntimeException类和Error类,其中Error类无需关心,RuntimeException类捕不捕获、声不声明编译器都不关心,也不应该对其捕获,以使得RuntimeException被吞,而发生难以察觉的错误,它是必须被改正的编程错误。

 

二、异常基本语法

try:用于监听异常

catch:捕获异常

finally:在离开try-catch-finally这一级之前总会被执行

throw:抛出异常

Throws:方法开始出声明异常

实例一:了解try-catch基本用法

 

public class Demo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            throw new Exception("My Exception");
        }catch(Exception e) {
            System.out.println("Caught Exception");
            System.out.println("getMessage():" + e.getMessage());
            System.out.println("getLocalizedMessage():" + e.getLocalizedMessage());
            System.out.println("toString():" + e);
            System.out.println("printStackTrace():");
            e.printStackTrace();
        }
    }

}

 

输出:

 

结果说明:这里都是一些返回打印异常消息的方法,可以看出前者是后者的子集。

 

实例二:在任何情况下都会得到执行的finally子句

情况一:涉及break与continue

 

public class Demo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i = 0;
        while(true) {
            try {
                i++;
                if(i == 2) {
                    throw new Exception("My Exception");
                }
            }catch(Exception e) {
                e.printStackTrace();
                break;
            }finally {
                System.out.println("finally executed");
            }
            
        }
    }

}
View Code

 

输出结果:

 

结果说明:finally一定会在离开try-catch-finally块之前被执行。

 

情况二:return中使用finally

 

public class Demo4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            return;
        }finally {
            System.out.println("clearup");
        }
    }

}

 

输出结果:

clearup

 

结果说明:finally会保证重要的清理工作一定执行

 

实例三:throws的基本用法

声明为throws + 非RuntimeException的方法,编译将强制要求在该方法的调处(调用此方法的方法中),要么捕获异常,要么throws声明。

 

public class Demo5 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            test();
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    static void test() throws Exception{
        throw new Exception("Myexception") {};
    }

}

 

输出结果:

posted @ 2019-08-25 21:10  卑微芒果  Views(138)  Comments(0Edit  收藏  举报