`
javamvp
  • 浏览: 38871 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

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功能

相关推荐

    java异常处理机制示例(java抛出异常、捕获、断言)

    断言(Assertion)是Java中的一个功能,用于在开发阶段检查程序状态。在`AssertTest`中,使用`assert`语句来确保除数不为零。如果条件不满足,断言失败,程序会抛出`AssertionError`异常。在生产环境中,断言通常是...

    Test6.java.zip

    综上所述,"Test6.java.zip"文件中的"Test6.java"可能是实现特定功能或测试用例的Java源代码。要理解并运行这个程序,我们需要将其解压缩,然后使用Java编译器编译成字节码,最后通过Java虚拟机执行。对于进一步的...

    java 异常种类总结【转】.docx

    java.lang.AssertionError 是一种断言错,指的是在程序中断言失败时抛出的异常。 15. java.lang.ClassCircularityError 类循环依赖错误 java.lang.ClassCircularityError 是一种类循环依赖错误,指的是在程序中类...

    业务异常提示处理 springboot+Assert(自定义断言)

    2. **Assert(断言)**:在Java编程中,`assert`关键字用于在测试阶段检查代码假设是否正确,它是进行单元测试和调试的强大工具。在本项目中,通过扩展Spring Boot的断言功能,我们可以创建自定义的断言方法,以适应...

    JAVA程序设计——异常和断言

    在JAVA中,可以使用`assert`关键字来声明断言,例如`assert value &gt; 0;`,表示期望value的值大于0。如果断言的条件不满足,程序将抛出AssertionError。断言通常在开发和测试阶段启用,在生产环境中可以禁用,以提高...

    Apress.Beginning.Java.SE.6.Platform.Oct.2007.pdf

    《Apress Beginning Java SE 6 Platform Oct.2007》是针对Java Standard Edition 6(也称为Java 6)的一本入门教程,由Apress出版社出版。这本书旨在为初学者提供全面的Java编程知识,同时也适合作为有经验开发者...

    Java断言(assert)

    Java断言(assert) Java断言是一种 debugging 机制,允许开发者在Java...Java断言是一种强大的调试工具,可以帮助开发者快速地检测程序中的错误和异常。但是,断言应该谨慎使用,不然可能会影响程序的性能和可靠性。

    J2SE技术总结-Java学习精华教程-电子书

    ..........Java中的IO .....I/O_BIO ..........I/O流对象与使用 ..........文件相关类的使用 .....集合 ..........概述 ..........集合API .....线程 ..........概念 ..........操作线程 ..........线程安全-使用...

    Java异常和断言PPT教案学习.pptx

    在Java中,异常分为两大类:错误(Error)和违例(Exception)。错误通常是JVM系统内部的问题,如内存耗尽或无法恢复的硬件故障,而违例则更多是由编程错误或外部条件引起的,如除数为零、空指针访问或者文件未找到...

    zzxwill#zhouzhengxi.com#java断言测试1

    - "断言"*@Function:断言public class TestAssert {开启MyEclipse对断言的支持。

    TQLOnlineTest.java

    类是Java中的基本构造块,用于封装数据和行为;对象则是类的实例,它们执行实际的工作;方法则定义了对象的行为,执行特定的任务。 接下来,我们讨论在线测试。在线测试通常指的是在实际运行环境中对软件进行的测试...

    JAVA中常见的异常

    ### JAVA中常见的异常知识点详解 #### 一、`java.lang.NullPointerException` 在Java编程中,`java.lang.NullPointerException`(简称NPE)是最常见的异常之一。这种异常通常发生在尝试访问一个空对象引用的方法或...

    fest-assert-2.x, FEST断言 2.x.zip

    fest-assert-2.x, FEST断言 2.x fest断言为断言提供了一个连贯的接口。例如:int removed = employees.removeFired();assertThat(removed).isZero();List&lt;Employee&g

    javaweb中.java文件测试需要的框架(junit测试).rar

    在Java Web开发中,进行单元测试是确保代码质量与可靠性的关键步骤。JUnit是一个流行的、开源的Java单元测试框架,它使得开发者能够方便地编写和执行针对Java类的测试用例。本压缩包文件"javaweb中.java文件测试需要...

    [java.核心技术.第八版].Core.Java..8th.Edition源代码 示例代码

    第1章 Java 程序设计概述 1.1 Java 程序设计平台 1.2 Java 白皮书的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 ...第11章 异常、日志、断言和调试 第12章 泛型程序设计 第13章 集合 第14章 多线程

    JAVA断言技术详解

    JAVA断言技术详解,1、What will happen when you attempt to compile and run the following code? (Assume that the code is compiled and run with assertions enabled) 1. public class AssertTest 2. { 3. ...

    baidu.java.zip_mac_selenium

    在Java中,我们可以使用Selenium的WebDriver接口来控制浏览器,如Chrome或Firefox,执行各种操作,如打开页面、点击元素、填写表单等。 Selenium WebDriver与Mac操作系统结合时,我们需要安装对应的浏览器驱动,...

    JAVA异常详解.doc

    Java异常处理是编程中至关重要的一个部分,它用于处理程序运行时出现的错误和异常情况。Java异常体系是基于面向对象的设计,使得错误处理更加结构化和可维护。以下是Java异常的一些主要类别和相关知识点: 1. **...

    scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetExcep

    `AssertionError`是Java中用于断言失败的异常,而`InvocationTargetException`则是在调用方法时抛出的异常,通常与方法内部的异常处理有关。 解决这个问题的方法可能有以下几点: 1. **检查版本兼容性**:确保你的...

    Java中断言使用案例

    下面将详细阐述Java中断言的原理、好处以及如何使用。 1. **什么是Java断言**: Java断言是一种机制,用于在开发和测试阶段插入条件检查,以便快速捕获不合理的或错误的代码行为。断言语句通常包含一个布尔表达式...

Global site tag (gtag.js) - Google Analytics