最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中斷言(assert)的使用場(chǎng)景與注意事項(xiàng)

 更新時(shí)間:2026年05月18日 09:52:06   作者:希望永不加班  
文章詳細(xì)介紹了Java斷言(assert)的使用方法、適用場(chǎng)景及注意事項(xiàng),斷言是一種調(diào)試工具,用于開發(fā)和測(cè)試階段快速定位代碼邏輯錯(cuò)誤,但非業(yè)務(wù)級(jí)校驗(yàn),不應(yīng)用于對(duì)外接口、業(yè)務(wù)容錯(cuò)等場(chǎng)景,應(yīng)嚴(yán)格區(qū)分?jǐn)嘌耘c常規(guī)異常,避免濫用,確保代碼質(zhì)量和生產(chǎn)環(huán)境穩(wěn)定性

引言

在Java開發(fā)中,斷言(關(guān)鍵字assert)是一種內(nèi)置的調(diào)試校驗(yàn)機(jī)制,設(shè)計(jì)初衷是在開發(fā)和測(cè)試階段,快速定位代碼中的邏輯錯(cuò)誤,預(yù)判某個(gè)條件必須為true,若不成立則直接終止程序,倒逼開發(fā)者及時(shí)發(fā)現(xiàn)問題。

很多開發(fā)者對(duì)斷言的理解停留在“簡(jiǎn)單校驗(yàn)”層面,要么濫用斷言替代業(yè)務(wù)校驗(yàn),要么不知道如何正確開啟、合理使用,甚至踩中“生產(chǎn)環(huán)境斷言失效”“斷言表達(dá)式有副作用”等坑。

一、什么是斷言?

1.1 定義與核心定位

斷言(assert)是Java提供的一種輕量級(jí)調(diào)試工具,用于在代碼中聲明一個(gè)“必須成立”的邏輯條件(布爾表達(dá)式)。其核心作用是:在開發(fā)/測(cè)試階段,主動(dòng)校驗(yàn)代碼邏輯的合法性,提前暴露潛在bug,避免錯(cuò)誤邏輯流轉(zhuǎn)到后續(xù)流程。

核心特點(diǎn):

  • 非業(yè)務(wù)級(jí)校驗(yàn),屬于調(diào)試級(jí)校驗(yàn),不適合用于業(yè)務(wù)邏輯容錯(cuò);
  • 默認(rèn)關(guān)閉,需手動(dòng)開啟虛擬機(jī)參數(shù)才能生效;
  • 斷言失敗會(huì)拋出AssertionError(屬于Error級(jí)別,而非Exception),程序直接終止,無法通過常規(guī)try-catch恢復(fù);
  • 關(guān)閉斷言后,JVM會(huì)直接跳過所有assert代碼,無任何性能損耗。

1.2 兩種標(biāo)準(zhǔn)語法格式

斷言只有兩種合法語法,無其他變體,使用時(shí)需嚴(yán)格遵循:

格式1:僅判斷條件,無錯(cuò)誤提示

// 語法:assert 布爾表達(dá)式;
// 說明:條件為true,正常執(zhí)行;為false,拋出AssertionError(無自定義信息)
assert num > 0;

格式2:判斷條件 + 自定義錯(cuò)誤提示

// 語法:assert 布爾表達(dá)式 : 錯(cuò)誤描述信息;
// 說明:條件為false時(shí),拋出的AssertionError會(huì)攜帶自定義信息,便于快速定位問題
assert num > 0 : "數(shù)值必須大于0,當(dāng)前值:" + num;

1.3 底層執(zhí)行原理

很多人疑惑“斷言默認(rèn)關(guān)閉,為什么不影響代碼編譯和運(yùn)行?”,核心在于JVM對(duì)斷言的處理機(jī)制:

1. 編譯階段:編譯器會(huì)保留assert語法,但不會(huì)對(duì)斷言表達(dá)式進(jìn)行提前執(zhí)行或優(yōu)化,僅做語法校驗(yàn);

2. 運(yùn)行階段:JVM會(huì)根據(jù)啟動(dòng)參數(shù)(-ea/-da)決定是否執(zhí)行斷言校驗(yàn):

  • 開啟斷言(-ea):JVM執(zhí)行斷言表達(dá)式,若為false,創(chuàng)建AssertionError實(shí)例并拋出,終止程序;
  • 關(guān)閉斷言(默認(rèn),-da):JVM直接跳過所有assert語句,如同這些代碼不存在,無任何性能開銷。

3. 異常本質(zhì):AssertionError繼承自Error,屬于系統(tǒng)級(jí)嚴(yán)重錯(cuò)誤,設(shè)計(jì)目的是“終止程序、暴露 bug”,而非業(yè)務(wù)容錯(cuò),因此不建議捕獲處理。

二、斷言的開啟與關(guān)閉

斷言默認(rèn)處于關(guān)閉狀態(tài),無論代碼中寫了多少assert,不開啟VM參數(shù)就不會(huì)生效。以下是不同場(chǎng)景下的開啟/關(guān)閉方法,覆蓋開發(fā)、測(cè)試、生產(chǎn)全場(chǎng)景。

2.1 核心VM參數(shù)

參數(shù)全稱作用適用場(chǎng)景
-eaenableassertions開啟全局?jǐn)嘌?/td>開發(fā)、測(cè)試階段
-dadisableassertions關(guān)閉全局?jǐn)嘌?/td>生產(chǎn)環(huán)境(默認(rèn))

2.2 IDEA中開啟/關(guān)閉斷言

開發(fā)階段,在IDEA中配置VM參數(shù),快速啟用斷言,步驟如下(以IDEA 2023版本為例):

補(bǔ)充:若想給單個(gè)類、單個(gè)包開啟斷言,可在VM options中指定粒度,例如:

-ea:com.test.AssertDemo  // 只給com.test包下的AssertDemo類開啟斷言
-ea:com.util            // 給com.util整個(gè)包開啟斷言
-da:com.service         // 給com.service整個(gè)包關(guān)閉斷言

2.3 命令行運(yùn)行時(shí)開啟/關(guān)閉斷言

測(cè)試、部署階段,通過命令行運(yùn)行Java程序時(shí),指定VM參數(shù)即可:

// 1. 開啟全局?jǐn)嘌?,運(yùn)行AssertDemo類
java -ea AssertDemo
// 2. 開啟指定包的斷言,運(yùn)行AssertDemo類
java -ea:com.test -ea:com.util AssertDemo
// 3. 關(guān)閉全局?jǐn)嘌裕J(rèn),可省略)
java -da AssertDemo
// 4. 運(yùn)行jar包時(shí)開啟斷言
java -ea -jar demo.jar

2.4 生產(chǎn)環(huán)境的斷言建議

生產(chǎn)環(huán)境嚴(yán)禁開啟斷言,原因有二:

核心原則:斷言只在開發(fā)、測(cè)試階段啟用,生產(chǎn)環(huán)境保持默認(rèn)關(guān)閉狀態(tài)。

三、斷言的基礎(chǔ)使用示例

結(jié)合日常開發(fā)中的調(diào)試場(chǎng)景,給出4個(gè)典型示例,幫你快速上手?jǐn)嘌缘氖褂?,區(qū)分“正確用法”和“潛在風(fēng)險(xiǎn)”。

示例1:數(shù)值合法性校驗(yàn)

校驗(yàn)方法入?yún)ⅰ⒕植孔兞康臄?shù)值范圍,快速定位非法值:

public class AssertDemo {
    public static void setAge(int age) {
        // 斷言:年齡必須在0~150之間(開發(fā)階段校驗(yàn),防止非法值)
        assert age > 0 && age < 150 : "年齡范圍非法,當(dāng)前值:" + age;
        System.out.println("年齡設(shè)置成功:" + age);
    }
    public static void main(String[] args) {
        setAge(20);  // 正常執(zhí)行
        setAge(-5);  // 開啟斷言后,拋出AssertionError
    }
}

開啟-ea后的運(yùn)行結(jié)果:

年齡設(shè)置成功:20
Exception in thread "main" java.lang.AssertionError: 年齡范圍非法,當(dāng)前值:-5
    at com.test.AssertDemo.setAge(AssertDemo.java:6)
    at com.test.AssertDemo.main(AssertDemo.java:13)

示例2:對(duì)象非空校驗(yàn)

校驗(yàn)內(nèi)部方法的參數(shù)、返回值是否為null,避免后續(xù)空指針異常:

public class UserService {
    // 私有內(nèi)部工具方法,僅本類調(diào)用
    private User getValidUser(Long userId) {
        User user = userDao.selectById(userId);
        // 斷言:查詢結(jié)果不為null(開發(fā)階段校驗(yàn),防止漏處理null場(chǎng)景)
        assert user != null : "用戶不存在,userId:" + userId;
        return user;
    }
    // 對(duì)外公開方法(禁止用斷言做校驗(yàn))
    public void updateUser(Long userId, String name) {
        // 業(yè)務(wù)校驗(yàn):用常規(guī)異常,不使用斷言
        if (userId == null) {
            throw new IllegalArgumentException("userId不能為空");
        }
        User user = getValidUser(userId);
        user.setName(name);
        userDao.update(user);
    }
}

示例3:分支邏輯完備性校驗(yàn)

switch、枚舉判斷中,用斷言兜底,防止后續(xù)新增分支、枚舉值時(shí)漏處理:

// 訂單狀態(tài)枚舉
enum OrderStatus {
    PENDING, PAID, SHIPPED, FINISHED, CANCELLED
}
public class OrderService {
    public void handleOrder(OrderStatus status) {
        switch (status) {
            case PENDING:
                System.out.println("處理待支付訂單");
                break;
            case PAID:
                System.out.println("處理已支付訂單");
                break;
            case SHIPPED:
                System.out.println("處理已發(fā)貨訂單");
                break;
            case FINISHED:
                System.out.println("處理已完成訂單");
                break;
            case CANCELLED:
                System.out.println("處理已取消訂單");
                break;
            // 兜底斷言:若新增枚舉值,未添加分支,開發(fā)階段會(huì)直接報(bào)錯(cuò)
            default:
                assert false : "未處理的訂單狀態(tài):" + status.name();
        }
    }
}

說明:若后續(xù)新增枚舉值REFUNDED(退款),但未在switch中添加分支,開發(fā)階段調(diào)用handleOrder(OrderStatus.REFUNDED),開啟斷言后會(huì)直接拋出錯(cuò)誤,提醒開發(fā)者補(bǔ)充分支處理。

示例4:方法后置結(jié)果校驗(yàn)

校驗(yàn)方法執(zhí)行后的返回結(jié)果,確保符合邏輯預(yù)期,防止計(jì)算錯(cuò)誤、數(shù)據(jù)異常:

public class CalculationUtil {
    // 計(jì)算兩個(gè)正整數(shù)的和
    public static int add(int a, int b) {
        assert a > 0 && b > 0 : "參數(shù)必須為正整數(shù)"; // 前置斷言
        int result = a + b;
        // 后置斷言:確保計(jì)算結(jié)果大于任一參數(shù)(邏輯兜底)
        assert result > a && result > b : "加法計(jì)算異常,a:" + a + ",b:" + b + ",result:" + result;
        return result;
    }
    public static void main(String[] args) {
        add(2, 3);  // 正常執(zhí)行,result=5
        add(2, -3); // 開啟斷言后,前置斷言失敗,拋出錯(cuò)誤
    }
}

四、斷言的適用場(chǎng)景

斷言的核心價(jià)值是“開發(fā)調(diào)試、邏輯兜底”,僅適用于內(nèi)部邏輯校驗(yàn),嚴(yán)禁用于業(yè)務(wù)相關(guān)校驗(yàn)。以下是斷言的4個(gè)核心適用場(chǎng)景,每個(gè)場(chǎng)景都結(jié)合實(shí)戰(zhàn)場(chǎng)景說明,幫你精準(zhǔn)判斷何時(shí)能用。

場(chǎng)景1:內(nèi)部邏輯狀態(tài)校驗(yàn)

用于校驗(yàn)“理論上絕對(duì)不可能發(fā)生”的邏輯錯(cuò)誤,比如:

核心原則:這種場(chǎng)景下,斷言失敗意味著“代碼邏輯有bug”,需要開發(fā)者修復(fù),而非業(yè)務(wù)異常。

場(chǎng)景2:私有工具方法的前置/后置校驗(yàn)

僅針對(duì)本類內(nèi)部的私有方法(不對(duì)外暴露),做參數(shù)、返回值的校驗(yàn),用于開發(fā)階段快速發(fā)現(xiàn)調(diào)用錯(cuò)誤。

原因:私有方法的調(diào)用者是本類開發(fā)者,可控制調(diào)用參數(shù),用斷言調(diào)試效率更高;對(duì)外公開方法則不適用(調(diào)用者不可控,且斷言默認(rèn)關(guān)閉)。

場(chǎng)景3:系統(tǒng)初始化時(shí)的配置、常量校驗(yàn)

系統(tǒng)啟動(dòng)、類初始化時(shí),校驗(yàn)配置參數(shù)、常量的合法性,確保系統(tǒng)運(yùn)行的基礎(chǔ)條件成立:

public class SystemConfig {
    // 系統(tǒng)分頁最大條數(shù)(配置文件讀?。?
    public static final int MAX_PAGE_SIZE = 100;
    // 靜態(tài)代碼塊中用斷言校驗(yàn)常量
    static {
        assert MAX_PAGE_SIZE > 0 && MAX_PAGE_SIZE <= 100 : "分頁最大條數(shù)配置非法,需在1~100之間";
        assert !StringUtils.isBlank(DB_URL) : "數(shù)據(jù)庫URL配置不能為空";
    }
}

說明:這種校驗(yàn)僅在開發(fā)、測(cè)試階段生效,若配置錯(cuò)誤,啟動(dòng)時(shí)直接拋出錯(cuò)誤,便于及時(shí)修正配置。

場(chǎng)景4:調(diào)試階段的臨時(shí)校驗(yàn)

開發(fā)自測(cè)時(shí),用斷言臨時(shí)校驗(yàn)?zāi)硞€(gè)邏輯點(diǎn),替代繁瑣的日志打印,快速卡死bug位置。例如:

// 開發(fā)自測(cè)時(shí),校驗(yàn)集合大小是否符合預(yù)期
List<Order> orderList = orderDao.selectByUserId(1L);
assert orderList.size() == 3 : "用戶1的訂單數(shù)量異常,預(yù)期3條,實(shí)際:" + orderList.size();

注意:自測(cè)完成后,可根據(jù)需求保留或刪除這類臨時(shí)斷言,避免冗余。

五、斷言絕對(duì)禁止使用的場(chǎng)景

這是開發(fā)者最容易踩坑的地方——把斷言當(dāng)作業(yè)務(wù)校驗(yàn)工具,導(dǎo)致生產(chǎn)環(huán)境出現(xiàn)邏輯漏洞。以下5個(gè)場(chǎng)景,嚴(yán)禁使用斷言,必須用常規(guī)異常、業(yè)務(wù)校驗(yàn)替代。

場(chǎng)景1:禁止用于對(duì)外公開接口、業(yè)務(wù)入?yún)⑿r?yàn)

這是最嚴(yán)重、最常見的錯(cuò)誤!生產(chǎn)環(huán)境默認(rèn)關(guān)閉斷言,若用斷言做業(yè)務(wù)入?yún)⑿r?yàn),會(huì)導(dǎo)致校驗(yàn)邏輯完全失效,非法參數(shù)直接流入業(yè)務(wù)流程,引發(fā)嚴(yán)重bug。

? 錯(cuò)誤寫法:

// 對(duì)外公開接口,用斷言做入?yún)⑿r?yàn)(生產(chǎn)環(huán)境失效)
public void login(String username, String password) {
    assert username != null && !username.isBlank() : "用戶名不能為空";
    assert password != null && password.length() >= 6 : "密碼長(zhǎng)度不能小于6位";
    // 業(yè)務(wù)邏輯...
}

? 正確寫法:

public void login(String username, String password) {
    if (username == null || username.isBlank()) {
        throw new IllegalArgumentException("用戶名不能為空");
    }
    if (password == null || password.length() < 6) {
        throw new IllegalArgumentException("密碼長(zhǎng)度不能小于6位");
    }
    // 業(yè)務(wù)邏輯...
}

核心原因:業(yè)務(wù)入?yún)⑿r?yàn)需要“始終生效”,而斷言默認(rèn)關(guān)閉,無法保證可靠性;且斷言失敗是Error,無法優(yōu)雅捕獲并返回業(yè)務(wù)錯(cuò)誤信息。

場(chǎng)景2:禁止在斷言表達(dá)式中寫有副作用的代碼

斷言表達(dá)式中,嚴(yán)禁寫“改變變量狀態(tài)、執(zhí)行IO操作、數(shù)據(jù)庫操作、接口調(diào)用”等有副作用的代碼——關(guān)閉斷言后,這些代碼會(huì)被直接跳過,導(dǎo)致業(yè)務(wù)邏輯行為不一致。

? 錯(cuò)誤寫法:

List<String> list = new ArrayList<>();
// 斷言表達(dá)式中執(zhí)行add操作(有副作用)
assert list.add("test") : "添加元素失敗";
// 關(guān)閉斷言后,list.add()不會(huì)執(zhí)行,list為空,后續(xù)邏輯出錯(cuò)

? 正確寫法:

List<String> list = new ArrayList<>();
boolean addSuccess = list.add("test");
// 先執(zhí)行操作,再斷言結(jié)果
assert addSuccess : "添加元素失敗";

場(chǎng)景3:禁止用于業(yè)務(wù)異常、容錯(cuò)處理

斷言的設(shè)計(jì)目的是“暴露 bug”,而非“處理業(yè)務(wù)異常”。業(yè)務(wù)異常(如用戶不存在、訂單已取消)是預(yù)期內(nèi)的,需要用Exception捕獲并做容錯(cuò)處理,而斷言失敗是預(yù)期外的邏輯bug,無需容錯(cuò)。

? 錯(cuò)誤寫法:

// 用斷言處理業(yè)務(wù)異常(用戶不存在是預(yù)期內(nèi)的業(yè)務(wù)場(chǎng)景)
User user = userDao.selectById(userId);
assert user != null : "用戶不存在"; // 錯(cuò)誤:業(yè)務(wù)異常不能用斷言

? 正確寫法:

User user = userDao.selectById(userId);
if (user == null) {
    throw new BusinessException("用戶不存在,userId:" + userId); // 業(yè)務(wù)異常
}

場(chǎng)景4:禁止依賴斷言做流程控制

斷言是調(diào)試工具,不是流程控制語句,嚴(yán)禁用斷言的“失敗終止”特性來控制代碼流程(如替代if判斷)。

? 錯(cuò)誤寫法(嚴(yán)禁):

// 用斷言控制流程(錯(cuò)誤,關(guān)閉斷言后流程會(huì)錯(cuò)亂)
assert num > 0;
// 若num<=0,開啟斷言會(huì)終止,關(guān)閉斷言會(huì)繼續(xù)執(zhí)行后續(xù)邏輯
System.out.println("num是正數(shù):" + num);

? 正確寫法:

if (num <= 0) {
    throw new IllegalArgumentException("num必須是正數(shù)");
}
System.out.println("num是正數(shù):" + num);

場(chǎng)景5:禁止用于權(quán)限校驗(yàn)、安全校驗(yàn)

權(quán)限校驗(yàn)、安全校驗(yàn)(如登錄態(tài)校驗(yàn)、接口權(quán)限校驗(yàn))是核心業(yè)務(wù)校驗(yàn),必須始終生效,而斷言默認(rèn)關(guān)閉,無法保證安全。

? 錯(cuò)誤寫法:

// 用斷言做登錄態(tài)校驗(yàn)(生產(chǎn)環(huán)境失效,存在安全隱患)
assert loginUser != null : "未登錄";
// 關(guān)閉斷言后,未登錄用戶也能執(zhí)行后續(xù)邏輯

? 正確寫法:

if (loginUser == null) {
    throw new UnauthorizedException("未登錄,請(qǐng)先登錄");
}

六、斷言的使用限制與注意事項(xiàng)

除了上述禁止場(chǎng)景,使用斷言時(shí)還需注意以下6個(gè)細(xì)節(jié),避免踩中隱藏坑,同時(shí)規(guī)范使用方式。

注意事項(xiàng)1:斷言默認(rèn)關(guān)閉,生產(chǎn)環(huán)境絕對(duì)不能依賴

無論開發(fā)階段用斷言做了多少校驗(yàn),都不能把“斷言生效”當(dāng)作生產(chǎn)環(huán)境的依賴——生產(chǎn)環(huán)境默認(rèn)關(guān)閉斷言,所有校驗(yàn)邏輯都會(huì)失效。

核心提醒:開發(fā)階段用斷言發(fā)現(xiàn)bug后,必須通過代碼邏輯修復(fù)bug,而非依賴斷言“兜底”。

注意事項(xiàng)2:斷言失敗是Error,不建議捕獲處理

AssertionError繼承自Error,屬于系統(tǒng)級(jí)錯(cuò)誤,設(shè)計(jì)目的是“終止程序、暴露 bug”,因此不建議用try-catch捕獲。

若強(qiáng)行捕獲,會(huì)掩蓋邏輯bug,導(dǎo)致錯(cuò)誤無法被發(fā)現(xiàn),違背斷言的設(shè)計(jì)初衷:

// 不推薦這樣做
try {
    assert num > 0 : "num非法";
} catch (AssertionError e) {
    // 捕獲后未做有效處理,掩蓋了bug
    System.out.println("斷言失敗:" + e.getMessage());
}

注意事項(xiàng)3:斷言的錯(cuò)誤信息要具體,便于定位問題

使用格式2(帶錯(cuò)誤信息)時(shí),錯(cuò)誤信息要包含“當(dāng)前異常值、異常場(chǎng)景”,避免模糊描述,否則難以快速定位bug。

? 不推薦:assert num &gt; 0 : &#34;num錯(cuò)誤&#34;;(信息模糊,不知道具體錯(cuò)誤原因)

? 推薦:assert num &gt; 0 : &#34;num必須大于0,當(dāng)前值:&#34; + num;(包含具體值,快速定位)

注意事項(xiàng)4:團(tuán)隊(duì)開發(fā)需統(tǒng)一斷言使用規(guī)范

多人協(xié)作開發(fā)時(shí),需約定斷言的使用場(chǎng)景,避免濫用、誤用:

注意事項(xiàng)5:避免與日志打印重復(fù)

斷言和日志的作用不同:斷言是“調(diào)試階段終止程序”,日志是“記錄運(yùn)行狀態(tài)”,無需在斷言前后重復(fù)打印日志。

? 冗余寫法:

System.out.println("校驗(yàn)num是否大于0");
assert num > 0 : "num非法";
System.out.println("num校驗(yàn)通過");

注意事項(xiàng)6:斷言不能替代單元測(cè)試

斷言是“代碼內(nèi)的調(diào)試校驗(yàn)”,單元測(cè)試是“獨(dú)立的測(cè)試用例”,兩者不能替代:

七、斷言 vs 常規(guī)異常

面試中常考“斷言和普通異常的區(qū)別”,以下從核心特性、適用場(chǎng)景等維度做對(duì)比,幫你快速記憶,應(yīng)對(duì)面試。

對(duì)比維度

斷言(assert)

普通業(yè)務(wù)異常(Exception)

默認(rèn)狀態(tài)

默認(rèn)關(guān)閉,需開啟VM參數(shù)

始終生效,無需額外配置

異常類型

Error級(jí)別(AssertionError)

Exception級(jí)別(可受檢/運(yùn)行時(shí)異常)

可捕獲性

可捕獲,但不建議捕獲(掩蓋bug)

可正常捕獲,用于業(yè)務(wù)容錯(cuò)

核心作用

開發(fā)調(diào)試,暴露邏輯bug

業(yè)務(wù)容錯(cuò),處理預(yù)期內(nèi)異常

適用場(chǎng)景

內(nèi)部邏輯校驗(yàn)、調(diào)試兜底

業(yè)務(wù)入?yún)?、?duì)外接口、權(quán)限校驗(yàn)

生產(chǎn)可靠性

不可靠(默認(rèn)關(guān)閉)

可靠(始終生效)

表達(dá)式限制

不能有業(yè)務(wù)副作用

可執(zhí)行有業(yè)務(wù)邏輯的表達(dá)式

八、全文總結(jié)

斷言(assert)是Java內(nèi)置的調(diào)試工具,核心價(jià)值是“開發(fā)階段快速定位邏輯bug”,記住以下3個(gè)核心原則,就能正確使用斷言,不踩坑:

1. 點(diǎn)擊頂部菜單欄「Run」→「Edit Configurations」;

2. 在彈出的窗口中,找到需要配置的Java類(如AssertDemo),點(diǎn)擊「Modify options」→「Add VM options」;

3. 在「VM options」輸入框中,填入-ea(開啟)或-da(關(guān)閉);

4. 點(diǎn)擊「Apply」→「OK」,重啟程序即可生效。

  • 斷言失敗會(huì)拋出AssertionError,直接終止程序,影響業(yè)務(wù)正常運(yùn)行;
  • 斷言的校驗(yàn)邏輯是“調(diào)試級(jí)”,不是“業(yè)務(wù)級(jí)”,生產(chǎn)環(huán)境無需依賴其做校驗(yàn)。
  • 局部變量的狀態(tài)異常(如數(shù)值為負(fù)、對(duì)象為null);
  • 方法執(zhí)行過程中的中間狀態(tài)異常;
  • 邏輯分支的兜底(如switchdefault、枚舉未覆蓋的情況)。
  • 僅用于內(nèi)部邏輯校驗(yàn)、開發(fā)調(diào)試,不準(zhǔn)用于業(yè)務(wù)入?yún)ⅰ?duì)外接口;
  • 禁止在斷言表達(dá)式中寫有副作用的代碼;
  • 統(tǒng)一使用格式2(帶錯(cuò)誤信息),便于定位問題。
  • 斷言:在代碼運(yùn)行過程中,實(shí)時(shí)校驗(yàn)邏輯狀態(tài);
  • 單元測(cè)試:獨(dú)立于代碼,覆蓋各種場(chǎng)景(包括異常場(chǎng)景),確保代碼功能正確。

1. 適用場(chǎng)景:僅用于內(nèi)部邏輯校驗(yàn)、開發(fā)調(diào)試、兜底校驗(yàn),比如私有方法參數(shù)校驗(yàn)、分支兜底、系統(tǒng)初始化配置校驗(yàn);

2. 禁止場(chǎng)景:嚴(yán)禁用于業(yè)務(wù)入?yún)?、?duì)外接口、權(quán)限校驗(yàn)、流程控制,這些場(chǎng)景必須用常規(guī)異常替代;

3. 核心細(xì)節(jié):默認(rèn)關(guān)閉,生產(chǎn)環(huán)境不依賴;斷言表達(dá)式無副作用;錯(cuò)誤信息要具體;不建議捕獲AssertionError。

以上就是Java中斷言(assert)的使用場(chǎng)景與注意事項(xiàng)的詳細(xì)內(nèi)容,更多關(guān)于Java斷言(assert)使用與注意事項(xiàng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot自定義日志注解的實(shí)現(xiàn)

    springboot自定義日志注解的實(shí)現(xiàn)

    本文主要介紹了springboot自定義日志注解的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java編碼輔助工具M(jìn)apstruct用法詳解

    Java編碼輔助工具M(jìn)apstruct用法詳解

    這篇文章主要介紹了Java編碼輔助工具M(jìn)apstruct用法詳解,手動(dòng)編碼setter/getter各個(gè)對(duì)應(yīng)屬性,會(huì)顯得臃腫繁瑣。通過Mapstruct框架可簡(jiǎn)單方便地完成這一工作。,需要的朋友可以參考下
    2019-06-06
  • Java方法遞歸與輸入輸出深入探索

    Java方法遞歸與輸入輸出深入探索

    這篇文章主要介紹了Java方法遞歸與輸入輸出的相關(guān)資料,方法遞歸是一種在方法內(nèi)部調(diào)用自身的技術(shù),適用于具有遞歸結(jié)構(gòu)的問題,輸入輸出是Java程序與外部世界交互的橋梁,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Mybatis的SqlRunner執(zhí)行流程實(shí)現(xiàn)

    Mybatis的SqlRunner執(zhí)行流程實(shí)現(xiàn)

    MyBatis提供了一個(gè)用于操作數(shù)據(jù)庫的SqlRunner工具類,對(duì)JDBC做了很好的封裝,本文主要介紹了Mybatis的SqlRunner執(zhí)行流程實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Spring的事務(wù)管理你了解嗎

    Spring的事務(wù)管理你了解嗎

    這篇文章主要為大家介紹了Spring的事務(wù)管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java Socket實(shí)現(xiàn)多人聊天系統(tǒng)

    Java Socket實(shí)現(xiàn)多人聊天系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java Socket實(shí)現(xiàn)多人聊天系統(tǒng),具有圖形界面,實(shí)現(xiàn)文件傳輸功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java 文件名截取方法

    java 文件名截取方法

    在實(shí)際開發(fā)應(yīng)用中會(huì)應(yīng)到截取文件名,本文將介紹java中文件名的截取,需要了解的朋友可以參考下
    2012-11-11
  • java連接FTP服務(wù)器圖文教程

    java連接FTP服務(wù)器圖文教程

    這篇文章主要給大家介紹了關(guān)于java連接FTP服務(wù)器的相關(guān)資料,Ftp是一種常見的文件存儲(chǔ)服務(wù)器,在很多的項(xiàng)目中都有使用,方便存儲(chǔ)各種格式的文件,使用java連接ftp文件服務(wù)器也是常用的工具類,需要的朋友可以參考下
    2023-08-08
  • Spring Security組件一鍵接入驗(yàn)證碼登錄和小程序登錄的詳細(xì)過程

    Spring Security組件一鍵接入驗(yàn)證碼登錄和小程序登錄的詳細(xì)過程

    這篇文章主要介紹了Spring Security 一鍵接入驗(yàn)證碼登錄和小程序登錄,簡(jiǎn)單介紹一下這個(gè)插件包的相關(guān)知識(shí),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-04-04
  • Spring 中的 @PathVariable 注解及應(yīng)用場(chǎng)景分析

    Spring 中的 @PathVariable 注解及應(yīng)用場(chǎng)景分析

    @PathVariable注解是 Spring 框架中一個(gè)非常實(shí)用的注解,它可以幫助我們輕松地從 URL 中提取參數(shù),從而實(shí)現(xiàn) RESTful API 的開發(fā),通過本文的介紹,我們了解了@PathVariable注解的基本使用方法和高級(jí)用法,以及它的應(yīng)用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2025-05-05

最新評(píng)論

五指山市| 华蓥市| 庐江县| 瓮安县| 申扎县| 安远县| 浮梁县| 深圳市| 新兴县| 正阳县| 敦化市| 会泽县| 韩城市| 疏附县| 宽城| 温宿县| 自贡市| 西林县| 新田县| 寿光市| 霍林郭勒市| 西藏| 丰台区| 藁城市| 米脂县| 株洲县| 黑龙江省| 太谷县| 观塘区| 水城县| 长寿区| 定南县| 崇文区| 黄梅县| 彩票| 民乐县| 平江县| 无极县| 光泽县| 文山县| 上虞市|