黑马程序员--Java学习日记之IO(异常处理与finally)



                                                            —— Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、引出
异常:就是程序出现了不正常的情况,这种情况有时候需要我们去处理,就像我们人生病了要去医院看病是一样的,
Java中把这些不正常的情况封装成各种类(因为Java是面向对象的),然后给他取了个名字,叫异常。

二、异常的分类
Throwable 类是 Java 语言中所有错误或异常的超类。他有两个子类Error和Exception
※ Error:严重错误,一般是程序中出现严重的问题,如内存溢出,这些我们需要修改程序,不需要单独当异常处理
※ Exception:这种问题就是我们需要处理 ,它又可以分为两种
->RuntimeException:运行时异常,可以不用处理,但在运行后JVM会自动显示异常信息
->非RuntimeException:编译时异常,必须处理才能运行程序

其中我们在程序中经常可以见的就是RuntimeException和各种非RuntimeException的异常,像ArithmeticException、NullPointerException和ClassCastException等等。

三、异常的处理方案
那么异常出现了,我们就需要去处理它,以让程序可以继续执行后面的语句,完成程序的功能。
Java提供了两种的异常处理方案:1.用try…catch…语句;2.throws的抛出方式
※ try…catch语句

首先给出该语句的基本语法格式:

try{
//可能会出现异常的代码
}catch(异常类型名称 变量名){
//针对问题的处理
}finally{
//释放资源
}

所以总结一下该语句中程序的处理过程:

  1. 执行try中的代码
  2. 如有异常,JVM会判断什么类型的异常,然后去类库中封装相应类型的“异常类”
  3. 在catch中匹配相应的类型,并执行语句,
  4. 最后执行try…catch后的语句

    按照上面的步骤,我们可以很清楚的得到上面图片显示的结果

但是我们程序的运行过程中可能会有几个或者很多的异常,那么我们怎么处理了,首先我们可以在程序中使用多个try…catch语句,但是显得程序有点冗余,于是我们可以用下面的多个catch语句格式

第二种方法之前,我们还需要了解运行时异常和编译时异常的区别:
* 编译期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译,像在Date类时的ParseException
* 运行期异常:无需显示处理,也可以和编译时异常一样处理,像在第一种方法里的NullPointerException,ArithmeticException等等

※throws抛出
上面我们知道了有编译器异常,比如下面的例子,就用到了throws的方法,先看代码

public class ExceptionThrows {
    public staticvoid main(String[] args) {
        //主方法里调用了该方法,接受了该异常,所以应该处理,这里用try...catch语句处理
        try {
            method();
        } catch (ParseException e) {
            //打印处理异常后的信息,调用的是父类Throwable中的方法
            e.printStackTrace();
        }
        System.out.println("程序完毕,拜拜!");
    }

    //method方法里显示将字符串转为Date类型并显示
    //在方法的后面用了throws方法跑出了一个异常
    public staticvoid method() throws ParseException {
        //声明一个字符串
        String st="2015-06-07";
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        //将该字符串转为Date类型,这一句会有编译期异常,所以我们采用throws的方法处理异常
        Date date=sdf.parse(st);
        System.out.println(date);
    }
}

这里我们总结下throw和throws的区别

  1. 使用位置
    #throw:用在方法体内。表示抛出某种类型的异常对象
    #throws:用在方法声明外,在方法体上声明,表示抛出某种类型的异常
  2. throws后跟的是异常类的类名,可以有多个
    throw后跟的是异常对象,只能有一个

四、finally关键字
在前面最初介绍try…catch里的语句中就有finally这个关键字,他的语句里是有关释放资源的。这个在IO流操作和数据库的操作中经常可以见到。并且finally的最大一个特点就是无论是否出现异常,都会被执行。

public class Finally {
    public static void main(String[] args) {
        try{
            System.out.println("打开一个文件......");
            System.out.println("读取文件内容......");
            //模拟一个异常
        //  System.out.println(10 / 0);


        }catch(Exception e){
            System.out.println("发生异常了");
        }finally{
            System.out.println("关闭文件。");
        }
    }
}


——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-



你可能感兴趣的:(IO流)