簡體   English   中英

Java切換失敗

[英]Java switch fallthrough

注意:帶有ADT 23.0.2的Eclipse Luna(4.4 R)

我一直在遵循Google關於如何開發android應用程序的指南,並且一路走來,出於好奇,我決定逐步運行代碼,當我按下操作欄時,執行就會跳入該代碼。 我遇到了這個奇怪的功能,但我不知道為什么會發生。

基本上,操作條形碼具有以下switch語句:

    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_settings:
            openSettings();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

因此,我在開關線上放置了一個斷點,當我觸摸操作欄時,開關通常會轉到與所觸摸圖標ID相對應的情況。

但是,執行也會通過默認情況。 我以前的理解是,只有在所有情況都不匹配的情況下才執行默認情況,那么為什么在這種情況下也要執行默認情況? 在每種情況下遇到return語句后,該方法都不會退出嗎? 這是Java switch語句的功能嗎?


更新:(如以下評論中所建議...)

因此,為了進行測試,我聲明了一個本地var來存儲id,但是我還在默認塊中添加了額外的一行。 修改后的代碼如下:

    // Handle presses on the action bar items
    int id = item.getItemId(); 
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_settings:
            openSettings();
            return true;
        default:
            id = 0;
            return super.onOptionsItemSelected(item);
    }

像上面提到的,其中一種情況被執行,並且默認返回也被高亮顯示,但是對0的id分配被跳過(不執行)。 因此,我認為這是僅調試器的功能。 大聲笑。 這是嚴重的誤導。 =(

您發布的代碼不會意外地跳到default情況,這是一個簡單的證明:

public class SO {
    public static boolean caseTest(int id) {
        switch (id) {
            case 0:
                System.out.println("Case 0:");
                return true;
            default:
                System.out.println("Default Case:");
                return false;
        }
    }

    public static void main(String[] args) {
        System.out.println("Returned:"+caseTest(0));
        //Prints:
        //Case 0:
        //Returned:true

        System.out.println("Returned:"+caseTest(1));
        //Prints:
        //Default Case:
        //Returned:false
    }
}

現在,對於可能成為問題的事物,請看一下R.id.action_searchR.id.action_settings的值,它們可能並不是您所想的。

暫無
暫無

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

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