JavaSE---异常

1、概述

    1.1  异常机制已经成为一门语言是否成熟的标准,传统的 C语言没有提供异常机制

                           主流的 Java、Python、C#均提供异常机制;

    1.2  Java的异常机制有try , catch , finally , throw , throws关键字:

          try:

            try后紧跟一个花括号括起来的代码块,又称try块;

            代码块放置可能引发异常的代码;

          catch:

            catch后对应异常类型和代码块;

            catch块用于处理这种异常类型;

            catch块可以有多个;

          finally:

            一个或多个catch块后紧跟finally块;

            finally块用于回收在try块中打开的物理资源;

            异常机制保证finally块总是被执行;

          throw:

            用于抛出实际的异常,可以作为单独语句使用,抛出一个具体异常对象;

          throws:

            主要在方法中使用;

            用于声明该方法可能抛出的异常;

    1.3  我们都希望所有的错误可以在编译阶段被发现,但不现实,很多问题需要在运行期间得到解决;

    1.4  Java将异常分为2种

          Checked异常

              Java认为  Checked异常都是  可以在编译阶段被处理,所有强制程序处理所有的Checked异常,Runtime异常则无需处理;

              Checked异常可以提醒程序员需要处理所有可能发生的异常;

          Runtime异常

2、异常处理机制

    1.1  Java的异常处理机制可以让程序具有更好的容错性、健壮性,

    1.2  如果try块中的业务代码出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行环境,此过程称为    抛异常;

    1.3  当Java环境接收到异常对象时,会寻找处理该异常对象的catch块,如果找到合适的就交由catch块处理,此过程称为    捕获异常;

                                     如果找不到捕获异常的catch块,则运行环境终止,Java程序退出;

    1.4  Java提供的异常类体系:

                                    

          1.1.1  Java把非正常情况分为:异常(Exception)、错误(Error),都继承自Throwable类  

                错误(Error):一般指程序无法处理的错误,JVM相关的问题(系统崩溃、JVM出错等),这种错误无法恢复或不可能捕捉,导致程序终止;

                异常(Exception):程序可以处理的异常;

          1.1.2  按责任分

                Error  是属于JVM的责任;

                RuntimeException  是属于程序的责任;

                CheckedException  是属于编译器的责任;

          1.1.3  常见异常体系

                

 

      1.5  【访问异常信息】

          1.1.1  如果程序需要在catch块中访问异常对象的信息,可以通过调用catch后异常形参获得;

          1.1.2  当Java运行时决定调用某个catch块处理异常对象时,会将该异常对象赋值给catch块后形参;

          

      1.6  【使用finally回收物理资源】

          1.1.1  有时候,在try块中打开一些物理资源(数据库连接、网络连接等),需要被显式回收

                  (Java的回收机制不会回收物理资源,只会回收堆内存对象所占的内存)

          1.1.2  为了保证一定回收try块中的物理资源,异常处理机制提供了finally块,不管try块中是否有异常,也不管哪个catch块被执行,finally块总被执行;

      1.7  【注意】

          1.1.1  异常处理结构语法中,只有try块是必须的(没有try,就没有catch,finally),catch块和finally块都是可选的;

          1.1.2  catch块和finally块至少出现其中之一,也可以同时出现(不能只有try);

          1.1.3  可以有多个catch块,但捕获父异常的catch  必须位于  捕获子异常的  后面;

          1.1.4  catch必须位于try之后,finally必须位于catch之后;

          1.1.5  案例

package com.exiuge.mytest.exception;

import java.io.FileInputStream;
import java.io.IOException;

/**
 *      除非在try、catch块中调用退出JVM的方法(System.exit(1)),不然finally块总会执行
 */
public class Test {

    public static void main(String[] args){
        FileInputStream fileInputStream=null;
        try {
            fileInputStream=new FileInputStream("a.txt");
        }catch (IOException ioe){
            System.out.println(ioe.getMessage());
            //return;
            System.exit(1);
        }finally {
            if (fileInputStream!=null){
                try {
                    fileInputStream.close();
                }catch (IOException ioe){
                    ioe.printStackTrace();
                }
                System.out.println("finally回收物理资源");
            }
        }
    }
}

 3、Throwable、Exception、RuntimeException

3.1、Throwable

The {@code Throwable} class is the superclass of all errors and exceptions in the Java language. 

Throwable 是 所有Error和Exception的基类

Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can be thrown by the Java {@code throw} statement. 

JVM 只能抛出 Throwable及其子类 或 throw语句

Similarly, only this class or one of its subclasses can be the argument type in a {@code catch} clause.

只有Throwable及其子类 能够作为catch语句的参数;

For the purposes of compile-time checking of exceptions, {@code Throwable} and any subclass of {@code Throwable} that is not also a subclass of either {@link RuntimeException} or {@link Error} are regarded as checked exceptions.

为了编译时检查异常,Throwable及其子类除了RuntimeException或Error及其子类)被视为 checked exceptions

3.2、Exception:

The class {@code Exception} and its subclasses are a form of {@code Throwable} that indicates conditions that a reasonable application might want to catch.

Exception和它的子类 是Throwable的一种表现形式;

The class {@code Exception} and any subclasses that are not also subclasses of {@link RuntimeException} are checked exceptions.

Exception 和 任何不是RuntimeException的子类  都是checked exceptions

Checked exceptions need to be declared in a method or constructor's {@code throws} clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.

如果Checked exceptions在方法或构造器执行时抛出,需要 在方法或构造器声明throws语句

 

3.3、RuntimeException:

RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.

RuntimeException 是 在JVM运行期间能够被抛出异常的 基类;

RuntimeException and its subclasses are unchecked exceptions. 

RuntimeException和它的子类都是 unchecked exceptions

Unchecked exceptions do not need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.

如果unchecked exceptions 在方法或构造器执行时抛出,不需要 在方法或构造器声明throws语句

 

 

 

          

posted on 2019-02-27 23:00  anpeiyong  阅读(121)  评论(0编辑  收藏  举报

导航