亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Switch 語句:常量表達式需要錯誤

Switch 語句:常量表達式需要錯誤

米脂 2022-07-06 19:11:53
Eclipse 顯示錯誤需要常量表達式,但所有字段都是final. 那為什么會拋出這個錯誤。有人可以解釋一下我的錯誤在哪里。package com.oca.test.exam;public class Test {    public static final Integer x1 = 5;    public static final Integer x2 = 10;    public static final Integer x3 = 15;    public static final Integer x4 = 20;    public static void main(String[] args) {        switch (x1) {        case x1:             System.out.println();            break;        case x2:             System.out.println();            break;        case x3:             System.out.println();            break;        case x4:             System.out.println();            break;        }    }}
查看完整描述

3 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

查看switch 語句的文檔,我們可以找到以下內容:

開關適用于 byte、short、char 和 int 原始數據類型。它還適用于枚舉類型(在 Enum Types 中討論)、String 類和一些包裝某些原始類型的特殊類:Character、Byte、Short 和 Integer(在 Numbers 和 Strings 中討論)。

起初這似乎很好,你的問題不應該存在。然而,該定義沒有提到這些包裝器可以在哪里使用,在哪里不可以使用。查看開關語句 (JLS) 的規范,我們發現開關具有以下形式:

1 開關表達式

SwitchStatement:  switch ( Expression ) SwitchBlock

Expression進一步解釋:

表達式的類型必須是 char、byte、short、int、Character、Byte、Short、Integer、String 或枚舉類型(第 8.9 節),否則會發生編譯時錯誤。

所以在這里,使用諸如Integer. 編譯器將管理。

2 開關塊

開關塊可以分解為:

SwitchLabels BlockStatements

SwitchLabel定義為:

SwitchLabel:  case ConstantExpression :  case EnumConstantName :  default :

所以標簽只接受常量表達式或枚舉。如果我們現在看一下常量表達式的定義,我們會發現:

常量表達式是表示原始類型值或字符串的表達式...

當然,必須應用一些條件才能使原始類型成為常量(在此處列出),但在您的情況下,重要的部分是您必須使用原始類型或字符串。

獎金

包裝類和原始類型之間的交換稱為“自動裝箱或拆箱”(取決于方向)。根據文檔,拆箱發生在以下情況:

將包裝類型 ( Integer) 的對象轉換為其對應的原始 ( int) 值稱為拆箱。Java 編譯器在包裝類的對象是以下情況時應用拆箱:

  • 作為參數傳遞給需要相應原始類型的值的方法。

  • 分配給相應原始類型的變量。

因此,似乎 Java 根本不是為了使 switch 語句按照您的意圖工作而進行所需的拆箱。

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

TL;博士

對于 switch 表達式,您可以使用包裝類。但是,對于標簽,您只能使用原始類型:byte、short、char 和 int。


查看完整回答
反對 回復 2022-07-06
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

case 表達式必須是常量表達式,你可以使用enum常量值和更可讀的代碼更好,這里是 enum 的示例:


枚舉類:


    public enum Numbers {


    HIGH(3), // calls constructor with value 3

    MEDIUM(2), // calls constructor with value 2

    LOW(1) // calls constructor with value 1

    ; // semicolon needed when fields / methods fol

    private final int levelCode;


    Numbers(int levelCode) {

        this.levelCode = levelCode;

    }


    public int getLevelCode() {

        return this.levelCode;

    }

}

為您提供主要方法:


public class Test {


    public static void main(String[] args) {

        switch (Numbers.HIGH) {

        case HIGH:

            System.out.println("hight");

            break;


        case MEDIUM:

            System.out.println("medium");

            break;


        case LOW:

            System.out.println("low");

            break;


        }


    }

}


查看完整回答
反對 回復 2022-07-06
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

final在 Java 中聲明的變量不被視為編譯時常量,因為它們的值仍然可以在運行時更改 - 從未定義狀態到已定義狀態。

案例值必須在現場定義,例如。case 5: case 12: case "green":


查看完整回答
反對 回復 2022-07-06
  • 3 回答
  • 0 關注
  • 271 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號