JavaSE---异常

Posted anpeiyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、Checked异常、Runtime异常

    1.1  Runtime异常:

        1.1.1  所有RuntimeException类及其子类均为Runtime异常;

        1.1.2  Runtime异常无须显式抛出,如程序需要捕获Runtime异常,也可以使用try...catch

    1.2  Checked异常:

        1.1.1  不属于RuntimeException类及其子类的为Checked异常;

        1.1.2  只有Java语言提供了Checked异常,其他语言都没有;

        1.1.3  Java任务Checked异常都是可以被处理的异常,必须显式处理,如果程序没有处理Checked异常,编译期间就会发生错误,无法通过编译;

        1.1.4  Checked异常的处理方式:

              当前方法如果明确知道如何处理该异常,则应该try...catch进行处理;

              当前方法如果不知道如何处理该异常,在定义方法时声明抛出异常;

 

 

          

以上是关于JavaSE---异常的主要内容,如果未能解决你的问题,请参考以下文章

javaSE第十九天

JavaSE-14 异常处理

15_JavaSE_异常处理

Java全栈JavaSE:15.异常

JavaSE学习总结

JavaSE入门学习25:Java异常处理(上)