java 学习之——异常机制

概述

异常指的是程序中的一些错误,在java中,这些错误也是由对象来描述。从继承关系来讲,程序中的异常可以分为两类:错误(Error)和 异常(Exception),异常下面又可以继续分为非运行时异常(检查性异常)运行时异常(非检查性异常)

  • 错误(Error):程序运行时环境(JVM)发生的错误。例如JVM 内存溢出。一般地,程序不会从错误中恢复。
  • 非运行时异常(检查性异常):编译期间就发现的错误。这是程序员无法预见的,例如要打开一个不存在文件时。这里面包括 NoSuchFieldException、ClassNotFoundException等。
  • 运行时异常(非检查性异常):正确通过编译,但是运行时发现了错误。它是可以被程序员避免的异常。其中包括包括 NullPointerException、IndexOutOfBoundsException、IllegalArgumentException 等。

java 中跟异常处理有关的对象之间的关系图。

 

异常处理的语法

1. try, catch, finally

try 关键字用来包围可能会出现异常的逻辑代码,它单独无法使用,必须配合catch或者finally使用。Java编译器允许的组合使用形式只有以下三种形式:

  try...catch...;       try....finally......;    try....catch...finally...

  • catch块可以有多个,注意try块只能有一个,finally块是可选的(但是最多只能有一个finally块)。
  • 三个块执行的顺序为try—>catch—>finally。
  • 当然如果没有发生异常,则catch块不会执行。但是finally块无论在什么情况下都是会执行的(这点要非常注意,因此部分情况下,都会将释放资源的操作放在finally块中进行)。
  • 在有多个catch块的时候,是按照catch块的先后顺序进行匹配的,一旦异常类型被一个catch块匹配,则不会与后面的catch块进行匹配。
  • 在使用try..catch..finally块的时候,注意千万不要在finally块中使用return,因为finally中的return会覆盖已有的返回值。

下面看一个例子:

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;





public class Main {

    public static void main(String[] args) {

        String str = new Main().openFile();

        System.out.println(str);

         

    }

     

    public String openFile() {

        try {

            FileInputStream inputStream = new FileInputStream("d:/a.txt");

            int ch = inputStream.read();

            System.out.println("aaa");

            return "step1";

        } catch (FileNotFoundException e) {

            System.out.println("file not found");

            return "step2";

        }catch (IOException e) {

            System.out.println("io exception");

            return "step3";

        }finally{

            System.out.println("finally block");

            //return "finally";

        }

    }

}


可以看出,在try块中发生FileNotFoundException之后,就跳到第一个catch块,打印"file not found"信息,并将"step2"赋值给返回值,然后执行finally块,最后将返回值返回。  

这段程序的输出结果为:

从这个例子说明,无论try块或者catch块中是否包含return语句,都会执行finally块。

如果将这个程序稍微修改一下,将finally块中的return语句注释去掉,运行结果是:

最后打印出的是"finally",返回值被重新覆盖了。

因此如果方法有返回值,切忌不要再finally中使用return,这样会使得程序结构变得混乱。

 

2. throws和thow关键字

  • throws 出现在方法的声明中,表示该方法可能会抛出的异常,然后交给上层调用它的方法程序处理,允许throws后面跟着多个异常类型;
  • throw 只会出现在方法体中,当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw出去。throw关键字的一个非常重要的作用就是 异常类型的转换。
  • throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由方法去处理异常,真正的处理异常由此方法的上层调用处理。

 

 


参考资料
http://www.runoob.com/java/java-exceptions.html

https://www.cnblogs.com/dolphin0520/p/3769804.html

你可能感兴趣的:(Java,相关)