簡體   English   中英

如何以編程方式測試斷言是否啟用?

[英]How to programmatically test if assertions are enabled?

OCP Java SE 6 程序員練習考試的正確答案之一是:

您可以在不拋出AssertionError的情況下以編程方式測試是否已啟用斷言。

我怎樣才能做到這一點?

我用這個

boolean assertOn = false;
// *assigns* true if assertions are on.
assert assertOn = true; 

我不確定這是“官方”方式。

Oracle Java 教程提供了有關如何執行此操作的信息...

http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html

教程摘錄

7. 為什么不提供一個構造來查詢包含類的斷言狀態?

這種結構會鼓勵人們內聯復雜的斷言代碼,我們認為這是一件壞事。 此外,如果您覺得必須,可以直接查詢當前 API 上的斷言狀態:

 boolean assertsEnabled = false; assert assertsEnabled = true; // Intentional side-effect!!! // Now assertsEnabled is set to the correct value
RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
boolean assertionsEnabled = mx.getInputArguments().contains("-ea");
package io.github.baijifeilong.tmp;

import io.vavr.control.Try;

/**
 * Created by BaiJiFeiLong@gmail.com at 2019-04-18 09:12
 */
public class TmpApp {

    public static void main(String[] args) {
        Try.run(() -> {
            assert false;
        }).onSuccess($ -> {
            throw new RuntimeException("Assertion is not enabled");
        });
    }
}

也許幫助某人。

我正在使用 jdk.nashorn.internal 中的 AssertsEnabled。

System.out.println(AssertsEnabled.assertsEnabled());
// "assertsEnabled()" returns boolean value

也許它可以幫助某人。

boolean ea=false;
try { assert(false); }
catch(AssertionError e) { ea=true; }

官方解決方案*:

在此處輸入圖像描述

資料來源: http://hg.openjdk.java.net/javadoc-next/api/nashorn/rev/fa79d912da1b#l1.38


* 官方的:

正如@Hurkan Dogan 在此處提到的,nashorn package 中有一個AssertsEnabled.assertsEnabled() api,現在已棄用。 但是,它的實施可以被視為官方解決方案。

另請注意,此解決方案也寫在官方文檔中, @Joe 在這里提到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM