6.Java中的异常、断言、日志【草稿中】

(本章主要讲解Java里面比较核心的一块内容——异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时间,最常见的情况就是辅助进行调试以及维护工作以及提高系统的容错性和稳定性。这一章和前边类和对象章节不一样,这一章可能涵盖的内容没有前边那章多,但是我会尽量保证在整篇文章里面把开发过程中需要注意到的与异常有关的细节问题以及对应的开发经验写入本文,而本章的出发点是异常处理,核心内容还涵盖了测试、调试、以及部署等相关内容以及。如果有笔误的地方,请来Email指点:silentbalanceyh@126.com,谢谢)

本章目录
1.Java异常处理
2.异常处理心得
3.断言的使用
4.Java中的日志(JDK1.4 Logging Framework)
5.第三方日志库(Log4j、Commons Logging Framework)
3.断言的使用
  assertion(断言)Java1.4引入的一个新特性,该特性的引入的目的是为了辅助开发人员调试测试,是一种比较常用的调试、测试方案。assertion在软件开发过程中是一种比较常用的调试方法;不仅仅如此,使用assertion可以在开发过程中证明程序的正确性,只是这种用法会对系统的整体设计存在很大的挑战,而且目前很少投入到实用里面,所以一般情况下使用assertion的目的是为了调试和测试
  i.assertion概念以及基本用法
  在代码实现的时候,需要使用关键字assert,而assertion本身在程序里面就是一条语句,它的作用是对boolean表达式进行检查,正确保证这个boolean表达式在程序运行到此刻的时候为true;一旦这个boolean表达式为false的话,就说明该程序已经处于了不正确的执行状态了,系统在断言开启的情况下会根据相关情况给出警告或者退出
  当在程序开发过程中,一般情况下使用assertion来保证整个应用程序里面最基本的、关键的正确性,而在操作过程中一般是开发和测试的时候开启该功能,一旦等软件开发完成过后,为了提高程序性能,发布的时候就将断言关闭
  1)语法:
  Java里面使用assert关键字来支持assertion,其本身包括了两种表达方式:
  [1]assert表达式1;
  [2]assert表达式1:表达式2;
  以上两种语法里面,表达式1表示一个boolean表达式,而表达式2一般是一个基本类型或者对象,这里需要说明的是在开发过程一般表达式2写的都是字符串以提供该断言失败的信息,但是真正在使用的时候应该理解的是表达式2也可以是某个对象或者基本类型,这里通过一个简单的例子来初次接触断言:
/**
*断言使用的概念说明代码
**/
public classAssertionDriver {
public static voidmain(Stringargs[]){
Employee employee =newEmployee();
employee.setName("Lang Yu");
employee.setEmail("silentbalanceyh@126.com");
businessProcess(employee);
}
public static voidbusinessProcess(Employee employee){
try{
assertemployee.getName() !=null&&
employee.getEmail() !=null&&
employee.getPassword() !=null:
employee;
}catch(AssertionError error){
System.out.println(error);
}
}
}

classEmployee{
privateStringname;
privateStringemail;
privateStringpassword;
publicStringgetName() {
returnname;
}
public voidsetName(Stringname) {
this.name = name;
}
publicString getEmail() {
returnemail;
}
public voidsetEmail(Stringemail) {
this.email = email;
}
publicStringgetPassword() {
returnpassword;
}
public voidsetPassword(Stringpassword) {
this.password = password;
}
@Override
publicStringtoString(){
return"\nName:"+ name +"\n"+"Email:"+ email +"\n"+"Password:"+ password;
}
}
  上边代码段使用了第二种表达式的方式,但是这里复杂的地方在于表达式2不是一个字符串,而是定义的Employee类的一个对象的实例,也就是说这里表达式2是一个Object实例,然后编译该代码,运行的时候打开断言,就可以得到下边的输出:
java.lang.AssertionError:
Name:Lang Yu
Email:silentbalanceyh@126.com
Password:null
  【*:当断言中表达式1返回false的时候,try块里面就抛出了AssertionError类型的断言错误,然后在catch块里面会将该错误打印出来,这种错误的格式为:java.lang.AssertionError:object.toString(),因为这里重写了Employee的toString方法,根据输出结果可以知道,返回false的boolean表达式为子表达式:(employee.getPassword() != null)】
  通常,在对某个对象执行关键操作时会需要对它创建断言。这有助于增强代码的健壮性,比如如果在程序中出现了某种错误,可以更方便地调试程序。这样做要比程序在某处执行失败造成不良后果来发现错误要好得多。当知道程序失败是由于它违反了假设而引起的时候,跟踪失败的原因要简单得多。
  2)语义:
  在运行的时候,如果关闭了assertion功能,这些语句将不会起任何作用,JVM认assertion的功能是关闭的,如果要上边这段代码输出该结果还需要一定的操作。如果assertion功能被打开,那么JVM会先计算表达式1的值,如果它为false,该语句会抛出一个AssertionError异常。若assertion语句包括了表达式2参数,程序将计算表达式2的结果,然后将这个结果作为AssertionError的构造函数的参数,用来创建AssertionError对象,并抛出该对象,若表达式1值为true,表达式2将不被计算
  这里简单看看AssertionError的API文档说明构造函数的定义:
AssertionError()
AssertionError(booleandetailMessage)
AssertionError(chardetailMessage)
AssertionError(doubledetailMessage)
AssertionError(floatdetailMessage)
AssertionError(intdetailMessage)
AssertionError(longdetailMessage)
AssertionError(Object detailMessage)
  在讲的断言里面,当表达式1false的时候,就需要构造AssertionError对象,构造的时候,传入的就是表达式2,也就是说在使用assertion的时候,AssertionError构造函数的实参就是真正在运行的表达式2,这样也可以理解表达式2为什么可以是基础类型,也可以是Object
  这里再提供几个简单的代码段,加深印象:
assert0 < value;
assert0 < value:"value = "+ value;
assertref != null:"ref doesn't equal null";
assertisValid();
  【*:再提醒一点,既然表达式1是一个boolean表达式,那么可以是一个返回值为boolean的函数。】
  3)编译和运行:
  【编译】
  由于assert是JDK 1.4才出来的关键字,使用老版本的JDK是无法编译带有assert的程序的,因此在使用javac命令编译该代码的时候,必须使用JDK 1.4或者更新的Java编译器,如果编译的时候因为无法识别assert关键字报错,那么需要加上编译参数-source 1.4这里的版本号至少是1.4或者以上的。直接使用javac命令编译的时候-source 1.4表示使用JDK 1.4版本的方式来编译源代码,版本太低带有assert关键字的代码就无法通过编译。关于javac和java命令的内容后边会有专程的章节介绍
  【运行】
  在运行带有assert语句的程序时,使用了新的ClassLoader的Class类,因此必须保证程序在JDK 1.4以及以上的版本或者JRE 1.4以及以上的版本环境里面运行。而在运行的时候,因为JVM默认是关闭了assertion功能的,所以要使用assertion功能的话必须显式使用加入参数来选择启用或者禁用断言。另外,断言的参数可以使得java应用程序可以开启一部分类或包的assertion功能,所以运行相对编译而言,比较复杂,这里有两类参数需要说明:
  [1]参数-esa和-dsa:
  该含义为开启(关闭)系统类的assertion功能。由于新版的Java的系统类中,也使用了assertion语句,如果用户需要观察它们本身的运行情况就需要打开assertion功能,可以使用参数-esa参数打开,使用-dsa参数关闭。-esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名具有同样的效果。
  [2]参数-ea和-da:
  它们的含义为开启(关闭)用户类的assertion功能:通过使用该参数,用户可以打开某些类或者包的assertion功能,同样用户也可以关闭某些类和包的assertion功能。打开assertion功能的参数为-ea;如果不带任何参数,表示打开所有用户类;如果带有包名称或者类名称,就表示打开这些类或包的assertion功能。-ea和-da的全名为-enableassertions和-disenableassertions
  这里提供一个表格来说明运行时断言参数的用法
参数 例子 说明 -ea java -ea 打开所有用户类的assertion -da java -da 关闭所有用户类的assertion -ea:<classname> java -ea:AssertionDriver 开打AssertionDriver类的assertion -da:<classname> java -da:AssertionDriver 关闭AssertionDriver类的assertion -ea:<packagename> java -ea:packagename 打开packagename包的assertion -da:<packagename> java -da:packagename 关闭packagename包的assertion -ea:... java -ea:... 打开缺省包(无名包)的assertion -da:... java -da:... 关闭缺省包(无名包)的assertion -ea:<packagename>... java -ea:packagename... 打开packagename包以及其子包的assertion -da:<packagename>... java -da:packagename... 关闭packagename包以及其子包的assertion -esa java -esa 打开系统类的assertion -dsa java -dsa 关闭系统类的assertion 综合使用 java -dsa:ClassOne:pkgOne 关闭ClassOne类和pkgOne包的assertion
  在上边的表格里面,需要说明的是:
  [1]...代表该包和该包对应的子包,如果系统有两个包分别为pkgOne和pkgOne.subpkg,则pkgOne...就代表这两个包
  [2]可是使用编程的方式来禁用或者启用assertion,下边提供一段代码来说明该功能:编程方式的assertion
/**
*使用程序开启断言的代码段
**/
classLoaded
{
public voidgo()
{
try
{
assert false:"Loaded.go()";
}
catch(AssertionError error){
System.out.println(error);
}
}
}

public classLoaderAssertions
{
public static voidmain(Stringargs[])
{
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
newLoaded().go();
}
}
  直接运行上边的代码会有下边的输出:
java.lang.AssertionError: Loaded.go()
  除了上边的代码使用的setDefaultAssertionStatus方法以外,ClassLoader的API里面还有以下几种方法:
  setDefaultAssertionStatus:用于开启/关闭assertion功能
  setPackageAssertionStatus:用于开启/关闭某些包的assertion功能
  setClassAssertionStatus: 用于开启/关闭某些类的assertion功能
  clearAssertionStatus:用于关闭assertion功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值