![](/img/trans.png)
[英]Android/Java - Delaying Runnables using Handlers or Scheduler?
[英]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.