`
turingfellow
  • 浏览: 135176 次
  • 性别: Icon_minigender_1
  • 来自: 福建省莆田市
社区版块
存档分类
最新评论

Java陷阱之assert关键字

阅读更多
Java陷阱之assert关键字

一、概述

在C和C++语言中都有assert关键,表示断言。
在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。

二、语法

在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。

assert关键字语法很简单,有两种用法:

1、assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。

2、assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。

三、应用实例

下面给出一个例子,通过例子说明其用法:

public class AssertFoo {    public static void main(String args[]) {        //断言1结果为true,则继续往下执行        assert true;        System.out.println("断言1没有问题,Go!");
        System.out.println("\n-----------------\n");
        //断言2结果为false,程序终止        assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!";        System.out.println("断言2没有问题,Go!");    }}

保存代码到C:\AssertFoo.java,然后按照下面的方式执行,查看控制台输出结果:

1、编译程序:
C:\>javac AssertFoo.java

2、默认执行程序,没有开启-ea开关:
C:\>java AssertFoo
断言1没有问题,Go!

-----------------

断言2没有问题,Go!

3、开启-ea开关,执行程序:
C:\>java -ea AssertFoo
断言1没有问题,Go!

-----------------

Exception in thread "main" java.lang.AssertionError: 断言失败,此表达式的信息将
会在抛出异常的时候输出!
        at AssertFoo.main(AssertFoo.java:10)

四、陷阱

assert关键字用法简单,但是使用assert往往会让你陷入越来越深的陷阱中。应避免使用。笔者经过研究,总结了以下原因:

1、assert关键字需要在运行时候显式开启才能生效,否则你的断言就没有任何意义。而现在主流的Java IDE工具默认都没有开启-ea断言检查功能。这就意味着你如果使用IDE工具编码,调试运行时候会有一定的麻烦。并且,对于Java Web应用,程序代码都是部署在容器里面,你没法直接去控制程序的运行,如果一定要开启-ea的开关,则需要更改Web容器的运行配置参数。这对程序的移植和部署都带来很大的不便。

2、用assert代替if是陷阱之二。assert的判断和if语句差不多,但两者的作用有着本质的区别:assert关键字本意上是为测试调试程序时使用的,但如果不小心用assert来控制了程序的业务流程,那在测试调试结束后去掉assert关键字就意味着修改了程序的正常的逻辑。

3、assert断言失败将面临程序的退出。这在一个生产环境下的应用是绝不能容忍的。一般都是通过异常处理来解决程序中潜在的错误。但是使用断言就很危险,一旦失败系统就挂了。


五、对assert的思考

assert既然是为了调试测试程序用,不在正式生产环境下用,那应该考虑更好的测试JUint来代替其做用,JUint相对assert关键的所提供的功能是有过之而无不及。当然完全可以通过IDE debug来进行调试测试。在此看来,assert的前途一片昏暗。

因此,应当避免在Java中使用assert关键字,除非哪一天Java默认支持开启-ea的开关,这时候可以考虑。对比一下,assert能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。
分享到:
评论

相关推荐

    Java陷阱之assert关键字详解

    标题中提到的“Java陷阱之assert关键字详解”所指的知识点主要涉及Java语言中assert关键字的介绍、使用、限制以及使用时需注意的潜在问题。Assert关键字作为Java SE 1.4版本引入的功能,其设计目的是为了帮助开发者...

    java 关键字查询文档

    Java 共有 50 多个关键字,它们包括但不限于 `abstract`、`assert`、`boolean`、`break`、`byte`、`case`、`catch`、`char`、`class`、`const`(虽然未使用)、`continue`、`default`、`do`、`double`、`else`、`...

    java面试中的陷阱java面试中的陷阱

    ### Java面试中的陷阱知识点解析 在Java面试过程中,面试官往往会通过一些问题来考察应聘者对Java基础知识的理解深度以及在实际编程中解决问题的能力。本文将根据提供的标题、描述及部分内容,整理并归纳出一系列...

    Java陷阱一箩筐

    7. **assert关键字**: - 在测试和调试阶段使用,用来断言某个条件是否为真,如果为假,程序会抛出AssertionError。 8. **Garbage Collection (GC)**: - 自动内存管理机制,负责回收不再使用的对象所占用的内存...

    java陷阱--面试(题集)杂谈

    第七,assert关键字用于断言,用于调试目的,在测试阶段启用,生产环境中通常关闭。它允许程序员在代码中设置条件,如果条件不成立,程序将抛出AssertionError。 第八,GC(Garbage Collector)是Java的内存管理...

    java陷阱一箩筐 面试笔试试题

    【Java 陷阱与面试知识点详解】 1. **final, finally, finalize**: - `final` 关键字用于声明变量、方法或类为不可变,防止被修改。 - `finally` 通常与 `try-catch` 结构一起使用,无论异常是否发生,finally ...

    Java陷阱一箩筐.doc

    【Java陷阱一箩筐】 Java 语言中包含许多微妙的概念和陷阱,对于开发者来说,理解这些概念至关重要。以下是一些常见的 Java 面试题及详细解释: 1. **final, finally, finalize的区别**: - `final`:用于声明...

    Java 面试中的陷阱

    7. **assert关键字**:用于断言,用于调试目的,只有在编译时开启断言(-ea)才会生效。 8. **GC(Garbage Collection)**:Java的自动内存管理机制,负责回收不再使用的对象所占用的内存,避免内存泄漏。 9. **...

    Java陷阱一箩筐笔试题

    Java编程语言中包含了许多陷阱和细节,这些都是面试官在寻找潜在候选人时经常提出的知识点。以下是一些关于Java面试题的详细解释: 1. **final, finally, finalize的区别**: - `final` 用于声明不可变变量、表示...

    Java面试中的陷阱

    Java面试中的陷阱往往涉及到对语言核心概念的深度理解,这些陷阱涵盖了从基本语法特性到高级设计模式的应用。面试官通常会通过一些看似简单但实际上需要深入理解的问题来测试候选人的技能和经验。 首先,我们来看看...

    java面试陷阱

    ### Java面试陷阱详解 #### 一、final, finally, finalize的区别 在Java中,`final`, `finally`, 和 `finalize` 这三个关键字虽然只相差一个字母,但在用途上却有着天壤之别。 - **final**: 这个关键字主要用于...

    Java程序员面试陷阱大全.doc

    Java编程语言在面试中常常...了解这些面试陷阱并深入理解它们的工作原理对于Java程序员来说非常重要,可以帮助避免潜在的问题并在面试中展现出扎实的基础知识。在实际开发中,灵活运用这些概念可以提高代码质量和效率。

    Java程序员面试可能遭遇的30个技术陷阱解析.doc

    Java程序员在面试中可能会遇到各种技术陷阱,这些陷阱涵盖了语言特性和常见的编程概念。以下是针对提供的部分内容进行的详细解析: 1. **final, finally, finalize的区别** - `final` 关键字用于声明不可变的类、...

    Java程序员面试可能遭遇的30个技术陷阱解析.pdf,这是一份不错的文件

    Java编程语言在面试中常常涉及众多技术...以上就是Java面试中常见的技术陷阱和解析,理解并掌握这些概念对于成为一名合格的Java程序员至关重要。在面试中,能够深入解释这些知识点将展示出扎实的理论基础和技术实力。

    程序员面试宝典(变态级Java程序员面试32问)pdf

    - **final**:关键字用于声明变量、方法或类不可变。当应用于变量时,一旦赋值就无法更改;应用于方法时,该方法不能被子类覆盖;应用于类时,则该类不能被继承。 - **finally**:与异常处理相关,用于`try...catch`...

    java程序员面试须知

    ### Java程序员面试须知 ...以上知识点不仅涵盖了Java基础语法、面向对象编程、集合框架、异常处理、线程控制等关键领域,还深入探讨了面试中常见的陷阱和细节,有助于Java程序员全面准备面试,提升专业技能。

    C++大学教程,一本适合初学者的入门教材(part1)

    1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 1.16 简单程序:两个整数相加 1.17 内存的...

Global site tag (gtag.js) - Google Analytics