簡體   English   中英

在Java中使用Runnables枚舉的nullPointerException

[英]nullPointerException with enum using Runnables in Java

我已經閱讀了nullPointerExceptions的解釋,並且知道指向的值具有空值,就像它正在引用一個對象一樣,但是我無法理解為什么我在使用某種枚舉時會得到一個null類似於switch語句,但當然不實際使用switch語句。 就像我提到的那樣,預期的行為應該像switch語句。 也許我缺少對枚舉和NPE概念的基本理解。 我的代碼如下。 (此代碼適用於Enigma密碼機)

void displayMenu() {
    System.out.println("MAIN MENU");
    System.out.println();
    Stream.of(menuChoice.values()).map(stream -> stream.ordinal() + ". " + stream.msg).forEach(System.out::println);
    System.out.println();
}

public enum menuChoice {

    QUIT("Quit the Enigma", EnigmaMachine.instance.quitAction),
    ENCRPYT("Encrypt", EnigmaMachine.instance.encryptAction),
    DECRYPT("Decrypt", EnigmaMachine.instance.decryptAction);
    private String msg;
    public Runnable action;

    private menuChoice(String message, Runnable r) {
        this.msg = message;
        this.action = r;
    }
}

menuChoice getUserChoice() {
    System.out.print("Please enter your choice: ");
    int choice = s.nextInt();
    return menuChoice.values()[choice];
}

在QUIT常量上,我使用了一個可運行的設置:

final Runnable quitAction = () -> {
    EnigmaMachine.instance.running = false;
};

stacktrace是這樣的:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at enigmamachine.EnigmaMachine.displayMenu(EnigmaMachine.java:24)
    at enigmamachine.EnigmaMachine.<init>(EnigmaMachine.java:85)
    at enigmamachine.EnigmaMachine.main(EnigmaMachine.java:91)
Caused by: java.lang.NullPointerException
    at enigmamachine.EnigmaMachine$menuChoice.<clinit>(EnigmaMachine.java:30)
    ... 3 more
Java Result: 1

我的構造函數是這樣的:

public EnigmaMachine() {
    this.running = true;
    while (this.running) {
        displayMenu();
        getUserChoice().action.run();
    }
}

對象實例是在代碼底部的main函數上方定義的。

static EnigmaMachine instance;
public static void main(String[] args) {
    instance = new EnigmaMachine();
}

我不一定要尋找解決方案,而是可能要對我要處理的內容進行更相關的解釋。 非常感謝。

僅僅因為EnigmaMachine.instance在此處調用QUIT("Quit the Enigma", EnigmaMachine.instance.quitAction)時仍然為null ,所以您會收到此問題。 您不應在構造函數內調用displayMenu()因為它為時過早,應將其稱為避免此問題的方法。

您可以在類中添加例如方法start,如下所示:

    public void start() {
        this.running = true;
        while (this.running) {
            displayMenu();
            getUserChoice().action.run();
        }
    }

然后在main方法中調用它

    instance = new EnigmaMachine();
    instance.start();

暫無
暫無

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

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