java基础知识--断言

                    断言

  在网上找了很多关于断言的博客知识点总结,加上java核心技术书籍上内容,整理出这篇学习博客

  这篇博客讲的很详细,见http://blog.csdn.net/silentbalanceyh/article/details/4564884内容

1、断言的概念

断言机制允许在测试期间向代码中插入一些检査语句 。 当代码发布时, 这些插人的检测语句将会被自动地移走。

    assertion(断言)Java1.4引入的一个新特性,该特性的引入的目的是为了辅助开发人员调试测试,是一种比较常用的调试、测试方案。

  assertion在软件开发过程中是一种比较常用的调试方法;不仅仅如此,使用assertion可以在开发过程中证明程序的正确性,只是这种用法会对系统的整体设计存在很大的挑战

  ,而且目前很少投入到实用里面,所以一般情况下使用assertion的目的是为了调试和测试

  Java 语言引人了关键字 assert 。

  这个关键字有两种形式 :

    assert  条件 ;

    assert  条件 : 表达式 ; 

    这两种形式都会对条件进行检测 , 如果结果为 false , 则抛出一个 AssertionError 异常。

    ·在第二种形式中, 表达式将被传人 AssertionError 的构造器 , 并转换成一个消息字符串。

  示例:

 1 /**
 2  *断言使用的概念说明代码
 3  **/
 4 public class AssertionDriver {
 5     public static void main(String args[]){
 6         Employee employee = new Employee();
 7         employee.setName("Tian lang");
 8         employee.setEmail("[email protected]");
 9         businessProcess(employee);
10     }
11
12     public static void businessProcess(Employee employee){
13         try{
14             assert employee.getName() != null &&
15                 employee.getEmail() != null &&
16                 employee.getPassword() != null:
17                     employee;
18         }catch(AssertionError error){
19             System.out.println(error);
20         }
21     }
22 }
23
24 class Employee{
25     private String name;
26     private String email;
27     private String password;
28     public String getName() {
29         return name;
30     }
31     public void setName(String name) {
32         this.name = name;
33     }
34     public String getEmail() {
35         return email;
36     }
37     public void setEmail(String email) {
38         this.email = email;
39     }
40     public String getPassword() {
41         return password;
42     }
43     public void setPassword(String password) {
44         this.password = password;
45     }
46     @Override
47     public String toString(){
48         return "/nName:" + name + "/n" + "Email:" + email + "/n" + "Password:" + password;
49     }
50 }

  上边代码段使用了第二种表达式的方式,但是这里复杂的地方在于表达式2不是一个字符串,而是定义的Employee类的一个对象的实例,也就是说这里表达式2是一个Object实例,然后编译该代码,运行的时候打开断言,就可以得到下边的输出: 

java.lang.AssertionError:
Name:Tian lang
Email:2433758932@qq.com
Password:null

2、在eclipse中如何使用断言

  (一)首先明确:

    java断言Assert是jdk1.4引入的。

  jvm 断言默认是关闭的。

  断言只适用于复杂的调试过程。

  断言一般用于程序执行结果的判断,千万不要让断言处理业务流程。

(二)判断eclipse是否开启了断言,

    代码如下:

1 public class AssertTest {
2
3 public static void main(String[] args) {
4 boolean isOpen = false;
5 assert isOpen=true; //如果开启了断言,会将isOpen的值改为true
6 System.out.println(isOpen);//打印是否开启了断言
7 }
8 }

执行上面代码,如果打印 true说明已经启用了断言,如果为 false 则没有启用断言。
如果没有启用断言,则按按照下面方法开启断言。

(三)eclipse中开启断言选择菜单:

    Run ---> Run Configurations...---> 选择 Arguments 选项卡
    在 VM arguments 文本框中输入: -ea 注意:中间没有空格,如果输入 -da 表示禁止断言。

      然后关闭该窗口,然后保存就开启了断言。

3、关于断言的思考  

  Java断言机制的出现,其主要目的是为了辅助程序员开发中的调试、测试、开发等操作,既然如此,在正规的业务流程中不能滥用,用不好有可能导致很严重的问题,有三点需要说明:

  【1】请开发人员牢记,断言默认是关闭的,所有主流的IDE包括Eclipse和NetBeans在调试代码过程都没有将断言打开,如果要打开断言,需要进行相关的设置,所以有时候

    加入了assert在代码里面了过后,在寻找系统关键环节的时候,必须记得打开断言功能。

  【2】不可以使用断言去替代正常的业务逻辑:这种情况对比地说就是assert和if语句,这两者在程序开发过程中有着本质性的概念差异。if最典型的解释就是,条件满足就执行,

    条件不满足就不用执行;而assert一般放在系统的关键位置,assert是确保条件表达式是正确的,如果不正确表示系统有Error,所以二者在概念上有本质的差别,所以开发人员必

    须记得不能使用assert去替代本来的if语句。而且有一点,在发布最终代码版本的时候,断言一般会关闭的,如果使用了这样的替代方式,就意味着未发布版本和发布版本的流程

    不一样使得在工业生产中。

  【3】assert的出现,意味着如果系统在此处出现AssertionError的话证明系统已经出现了不可恢复的错误,所以assert是不能用于正规的业务逻辑的,只能用于开发和调试,这种不可

    恢复错误在工业生产和工程项目里面有可能导致严重的问题,所以这种情况一定要仔细考虑assert的使用和位置。

  补充,具体断言可以查看开头目录中的博客,更为详细具体!

时间: 2024-10-28 19:07:16

java基础知识--断言的相关文章

Java基础知识的三十个经典问答

Java基础知识的三十个经典问答 1.面向对象的特点 抽象: 抽象是或略一个主题中与当前目标的无关的因素,一边充分考虑有关的内容.抽象并不能解决目标中所有的问题,只能选择其中的一部分,忽略其他的部分.抽象包含两个方面:一是过程抽象:一是数据抽象. 继承 继承是一种联接类的层次模型,允许和鼓励类的重用,提供了一种明确的共性的方法.对象的一个新类可以从现有的类中派生,这叫做类的继承.心累继承了原始类 的特性,新类称为原始类的派生类或者是子类,原始类称为新类的基类或者父类.子类可以从父类那里继承父类的

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

第1天:了解Java基础知识

Java的优势 1. 简单 不像C或者C++语言,Java中省去了对指针的操作.但是,Java中并没有省去指针,代替指针的是一种新的变量--引用,引用也是保存一个对象的内存地址. 2.方便 Java虚拟机自带垃圾回收器,能够自动回收内存资源.而C和C++语言,需要开发人员手动进行内存资源回收. 3.安全 不支持指针操作 4.平台无关性 Java语言是跨平台的,一次编译,到处运行. 而且,不同平台,C语言中数据类型所占的位数是不同的,而Java语言中,数据类型所占的位数是固定的. 5.面向对象 J

JAVA基础知识-java文化基础和运行环境

JAVA基础知识 1,java是95年sun公司推出的开发语言,发展很快,09年被oracle公司收购.至今分为SE.ME.EE三个发展方向和软件版本. 2,运行java的环境主要是通过JVM(java virtual machine)实现的.首先编写.java结尾的源文件,通过编译器编译成.class结尾的字节码文件,然后通过解释器实现在不同平台上一致运行的效果. 3,jvm,jre和jdk的区别:jvm,java虚拟机:jre,java运行环境,jdk:java开发工具包. 4,jdk的下载

java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上.如图所示: 1.管道输入流应该连接到管道输出流 ,输入流和输出流可以直接连接       2.使用多线程操作,结合线程进行操作.通常由某个线程从管道输入流中(PipedInputStream)对象读取.          并由其他线程将其写入到相应的端到输出流中.不能使用单线程

Java基础知识——类装载器与反射机制

类装载器ClassLoader 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件. 类装载器把一个类装入JVM中,要经过三步: 1.装载:查找和导入Class文件: 2.链接:执行校验.准备和解析(解析是可以选择的): 3.初始化:对类的静态变量.静态代码块执行初始化工作: 类装载工作由ClassLoader及其子类负责.JVM在运行时会产生三个ClassLoader:根装载器.ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器). 根装

JAVA基础知识整理

一.首先先明白get与post的基本定义和区别: 这是两种在客户端和服务器端进行请求-响应的方法. 1get:从指定的资源请求数据. 2post:向指定的资源提交要处理的数据. get基本上用于从服务器取回数据,注意:get方法可能返回缓存数据. post可以从服务器上获取数据,不过,post方法不会缓存数据,并且常用语连同请求一起发送数据. 二. Jquery $.get()方法. $.get()方法通过Http Get发起请求,从服务器上请求数据. 语法:&.get(URL,callback