zoukankan      html  css  js  c++  java
  • Java基础13一异常

    1.异常概念

    • 异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。
    • 设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。
    • Java语言使用异常处理机制为程序提供了异常处理的能力

    2.异常处理机制

    • Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该异常对象将被自动提交给JVM,这个过程称为抛出(throw)异常。
    • JVM接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常。
    • 如果JVM找不到可以捕获异常的代码,则运行时系统将终止,相应的Java程序也将退出。

    3.异常的分类

    • Java程序运行过程中所发生的异常事件从严重性可分为两类:

    – 错误(Error)JVM系统内部错误或资源耗尽等严重情况-属于JVM需要负担的责任

    • 这一类异常事件无法恢复或不可能捕获,将导致应用程序中断。

    – 异常(Exception):其它因编程错误或偶然的外在因素导致的一般性问题。

    • 这类异常得到恰当的处理时,程序有机会恢复至正常运行状况。
    • 程序员通常只能处理异常(Exception),而对错误(Error)无能为力
    • 从编程角度分:

    – 非受检(unchecked)异常:编译器不要求强制处置的异常

    • 一般是指编程时的逻辑错误。是程序员应该积极避免其出现的异常
      • java.lang.RuntimeException及它的子类都是非受检异常:
        • 错误的类型转换:java.lang.ClassCastException
        • 数组下标越界:java.lang.ArrayIndexOutOfBoundsException
        • 空指针访问:java.lang.NullPointerException
        • 算术异常(0溢出)java.lang.ArithmeticException

    – 受检(checked)异常:编译器要求必须处置的异常。指的是程序在运行时由于外界因素造成的一般性异常。

    • 没有找到指定名称的类:java.lang.ClassNotFoundException
    • 访问不存在的文件:java.io.FileNotFoundException
    • 操作文件时发生的异常:java.io.IOException
    • 操作数据库时发生的异常:java.sql.SQLException

    4.异常的处理

    • try语句

    – try{ … }语句包含了一段代码,这段代码就是一次捕获并处理异常的范围。

    – 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。

        catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。

    – catch中声明的异常对象(catch(ExceptionName e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。如:

      getMessage() 方法,用来获得有关异常事件的字符串信息。

      printStackTrace() 方法,用来跟踪异常事件发生时执行堆栈的内容。

    – 使用多重 catch 语句时,异常子类一定要位于异常父类之前。

    – 如果没有异常产生,所有的catch段的代码都会被忽略不执行

    注意:trycatch都不能单独使用,必须匹配使用才可以完成异常的监控和处理。

    语法:

    try{
    }catch(异常类型  对象){
    }

    异常处理:

    1.异常:程序在运行期间发生的不正常事件,它会打断指令的正常流程。

      异常都是发生在程序的运行期,编译出现的问题叫语法错误。

    2.异常的处理机制:

      1) 当程序在运行过程中出现了异常,JVM自动创建一个该类型的异常对象。同时把这个异常对象交给运行时系统。(抛出异常)

      2) 运行时系统接受到一个异常对象时,它会再产生异常的代码附近查找相应的处理方式。

      3) 如果有处理异常的代码,处理完后回到代码正常执行流程。如果没有,JVM就会中断程序的执行。

    3.异常的分类:

    java.lang.Throwable

    |-- Error错误:JVM内部的严重问题。无法恢复。程序开发人员不用处理。

    |-- Exception异常:普通的问题。通过合理的处理,程序还可以回到正常执行流程。要求编程人员要进行处理。

    |--RuntimeException:也叫非受检异常(unchecked exception)。这类异常是编程人员的逻辑问题。应该承担责任。Java编译器不进行强制要求处理。 也就是说,这类异常再程序中,可以进行处理,也可以不处理。

    |--RuntimeException:也叫受检异常(checked exception)。这类异常是由一些外部的偶然因素所引起的。Java编译器强制要求处理。也就是说,程序必须进行对这类异常进行处理。

    4.常见异常类:

     1)非受检:NullPointerException, ClassCastException, ArrayIndexsOutOfBoundsException, ArithmeticException

     2)受检:FileNotFoundException,IOException,SQLException,

    5.异常处理的两种方式:

    1)显式用try/catch进行处理:在异常的代码附近显示用try/catch进行处理(不合理),运行时系统捕获后会查询相应的catch处理块,再catch处理块中对该异常进行处理。

    try{
        //可能会出现异常的代码片段
    }catch(异常类型1 变量名){  //处理制定类型的异常
        //对该类型异常的处理代码段;
        e.printStackTrace();
    }catch(){
    }[finally{
        //无论是否发生异常都要执行的代码段;
        //经常用来清理资源
    }]

    2)向上声明:用throws关键字,向外声明。声明本方法可能会抛出的异常列表。

    ...方法名(参数列表) throws 异常类型1,异常类型2

    向上声明是告诉本方法的调用者,在使用本方法时,应该对这些异常进行处理。

    6.手动抛出一个异常: 当程序逻辑不符合期望时,要中止后面代码的执行时。

        在方法的代码段中,可以使用throw关键字手动抛出一个异常。

        注意:如果手动抛出的是受检异常,那么本方法必须进行处理(应该采用向上声明这个异常); 如果手动抛出的是非受检异常,那么可以进行处理,也可以不处理。

    7.自定义异常:当需要一些跟特定业务相关的异常信息类时。

    可以继承继承Exception来定义一个受检异常。也可以继承自RuntimeException或其子类来定义一个非受检异常。

    8.异常概括:一个图两种处理方式五个关键字.

    9.异常实践:

    观察抛出的异常的名字和行号很重要。

    应该捕获和处理那些已知如何处理的异常,传递那些不知如何处理的异常。

    尽量减少try语句块的体积。

    for(int i=1;i<=1000;i++){
        try{
            ...
        }catch(...){
        }
    }

    尽量减少try-catch语句的嵌套。

    catch块代码段中,应该打印除该异常的堆栈跟踪信息以方便调试。

    使用throws关键字来声明方法可能会抛出的异常

    throws可以声明方法可能会抛出一个或多个异常,异常之间用''隔开

    如果声明的可能会抛出的异常是非受检的,该方法的调用者可以处理也可以不处理。

    如果声明的可能会抛出的异常是受检的,该方法的调用者必须进行处理。

    throw关键字来手动抛出一个异常,

    如果手动抛出的异常是一个受检异常,那么必须进行处理

    处理方式有两种:

    1.显示用try/catch进行处理(不合理)

    2.throws向外声明(合理的处理方法) : 应捕获和处理那些已知如何处理的异常,而传递那些不知如何处理的异常。

    调试: Debug  

    双击:加断点。

     F5:进入方法

      F6:下一步(单步执行)

      F7:从方法返回

      F8:下一个断点,如果没有下一个断点,就结束。

  • 相关阅读:
    人民币格式化 ,分割
    解决IE下页面空白或者报错:[vuex] vuex requires a Promise polyfill in this browser
    js生成图片
    适用于iview的表格转Excel插件
    js金额转大写数字
    webstorm vue cli 热更新不起作用解决办法
    纯css实现 switch开关
    vue 时间戳转 YYYY-MM-DD h:m:s
    Simple2D-20(重构)
    Simple2D-19(音乐播放器)播放器的源码实现
  • 原文地址:https://www.cnblogs.com/smart-hwt/p/8203277.html
Copyright © 2011-2022 走看看