JSE5-异常和断言

1. 异常

1.1 概述

  • 异常: 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.

  • 异常发生时程序均会异常中断,而之前分配的所有资源则保持其状态不变。这会导致资源遗漏。要对异常适当处理,将以前系统分配的资源返还给系统。所以异常可能发生时,要须对每一异常分别进行处理。

  • 异常处理抓抛方法有两大优点:

(1):异常情况能在有必要之处加以处理,而不在其发生处和需要进行处理处之间的每一级上均进行处理;

(2):能够编写统一的、可重用的异常处理代码。

异常处理流也是程序中的控制流。当异常发生时,抛出一个异常。异常伴随调用链,直到它们被捕获或程序退出为止。

try{
        //放置可能出现异常的代码
    }catch(Exception1 el){
        //如果 try 块抛出异常对象的类型为 Exceptionl,那么就在这里进行处理
    }catch(Exception2 e2){
        //如果 try 块抛出异常对象的类型为 Exception2,那么就在这里进行处理
    }catch(ExceptionN eN){
        //如果 try 块抛出异常对象的类型为 ExceptionN,那么就在这里进行处理
    }finally{
    //不管是否有异常发生,始终执行这个代码块
}

1.2 异常代码

1.2.1:try.catch.finally

  • try

在try 语句块中包含可能会产生异常的语句。try 块后可随一个或多个 catch 块,用来捕获在 try 中抛出的异常。另一方面,try 不可以跟随在 catch 块之后。

  • catch 块

catch 用来捕获并处理 try 中抛出的异常的代码块。没有 try 块,catch 块不能单独存在,我们可有多个 catch 块,以捕获不同类型的异常。 多个catch 块时,从上往下 catch 异常的范围应该从小到大,因为
catch块的运行机制是找到一个匹配的就进行处理了,如果把范围大的放在前面,那么后面的代码就没有机会运行了.

  • finally 块
    finally 块表示:是可选的,无论是否出现异常,都会运行的块

通常在 finally 块中可以编写资源返还给系统的语句,通常,这些语句包括但不限于:

(1):释放动态分配的内存块:

(2):关闭文件;

(3):关闭数据库结果集;

(4):关闭与数据库建立的连接;

//e1的范围要小于e2
try{

}catch(异常类型 1   e1){

}catch(异常类型 2   e2){

}finally{

}  
  • try、catch、finally 块的关系

(1):try 块不能单独存在,后面必须跟 catch 块或者 finally 块

(2):三者之间的组合为:try—catch 、try—catch—finally 、 try—finally 这几种是合法的(3):一个 try 块可以有多个 catch 块,从上到下多个 catch 块的范围为从小到大

  • return之后也可以执行finally
try{
    return "aa";
}finally{
    System.out.println("last finally");
}

1.2.2 throw.throws 语句

  • throw 语句用来从代码中主动抛出异常。throw 的操作数是任一种异常类对象。
try {

int i = 5/0;

} catch (ArithmeticException i) {

throw new Exception("Can not be divided by zero!");

}
  • throws 语句

throws 用来在方法定义时声明异常。

Java 中对异常的处理有两种方法,一个就是 try-catch,然后自己处理;一个就是不做处理,向外 throws,由别人去处理。

1.3:调用栈机制

异常如果不try/catch,则会上抛直到处理,如果一直不处理会到 main(),如main()不处理,则该异常就异常地中断程序。

1.4:异常的分类

  • java.lang.Throwable 类充当所有对象的父类。在Throwable类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有 Error 和 Exception 两个基本子类。

    • 错误(Error):JVM 系统内部错误、资源耗尽等严重情况;
    • 异常(Exception ):其它因编程错误或偶然的外在因素导致的一般性问题。
  • Error发生 时,程序员根本无能为力,只能让程序终止。比如说内存溢出,不可能指望程序能处理这样的情况。而对于 Exception,而有补救或控制的可能,程序员也可以预先防。

1.5 异常继承层次

为有效地描述异常状况、传递有关的异常信息,JDK中针对各种异常情况定义了多种异常类型:

java异常-异常类继承层次

  • RuntimeException(运行时异常)是指因设计或实现方式不当导致的问题程序员的原因导致的,本来可以避免发生的情况。比如ArrayIndexOutOfBoundsException和NullPointerException提前判断都可以避免.

  • IOException 在内的其它违例,则可以认为是描述运行时遇到的困难,它通常由环境而并非程序员的原因引起,可以进行处理。例如:文件未找到或无效 URL 异常都经常容易出现。

  • Java 程序异常处理的原则为:

(1)对于 Error 和 RuntimeException,可以在程序中进行捕获和处理,但不是必须的;

(2)对于 IOException 及其它异常,必须在程序中进行捕获和处理。

1.7:自定义异常

预定义异常:Java 编程语言中预先定义好的异常叫预定义异常.
自定义异常:Java允许用户创建自己的异常类型,用于表述非预定义异常,这些类型也必须继承Throwable类或其子类。用户自定义异常类通常属 Exception 范畴,依据命名惯例,应以 Exception 结尾。用户自定义异常未被加入 JRE 的控制逻辑中,因此永远不会自动抛出,只能由人工创建并抛出。

2:断言

2.1 断言概述

  • 断言用于证明和测试程序的假设,比如“这里的值大于 5”。

  • 断言可以在运行时从代码中完全删除,所以对代码的运行速度没有影响。

  • 断言有两种方法:一种是 assert<<布尔表达式>>;另一种是 assert<<布尔表达式>>:<<细节描述>>。
    如果布尔表达式的值为 false,将抛出 AssertionError 异常;细节描述是 AssertionError

  • 断言使用 boolean 值,如果其值不为 true 则抛出 AssertionError 并终止程序的运行。

  • 断言推荐使用方法
    用于验证方法中的内部逻辑,包括:

    -内在不变式

    -控制流程不变式

    -后置条件和类不变式

    注意:不推荐用于公有方法内的前置条件的检查

  • 运行时要允许/屏蔽断言

运行时要屏蔽断言,可以用如下方法:
java –disableassertions 或 java –da

运行时要允许断言,可以用如下方法:
java –enableassertions  或 java –ea

注:文中内容来自网络文字总结.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值