2016-09-24 32 views
0

我的問題是: 當我試圖調用方法newFile.createYear();從菜單中的端口打印打印錯誤:從菜單類中的開關調用方法時線程「主」中的異常

Exception in thread "main" java.lang.NullPointerException 
at com.register.file.CreateFile.showYears(CreateFile.java:140) 
at com.register.file.CreateFile.createYear(CreateFile.java:30) 
at com.register.main.Menu.registers(Menu.java:30) 
at com.register.main.Menu.menu(Menu.java:132) 
at com.register.main.Main.main(Main.java:14) 

當我在eclipse中運行程序時,不會發生問題。我正在通過在終端中輸入java com.register.main.Main來運行程序。

此外,當我試圖返回上一級菜單,調用一個方法,(即使是在Eclipse)後:

的代碼從開關的一部分:

switch (selection) { 
      case 1: 
//method that clearing terminal (I can't find anything better :() 
       newClear.clearConsole(); 
//method that work only in eclipse, not terminal 
       newFile.createYear(); 
//name of current menu (back option) - doesn't work 
       registers(); 

       break; 

> Exception in thread "main" java.util.NoSuchElementException at 
> java.util.Scanner.throwFor(Unknown Source) at 
> java.util.Scanner.next(Unknown Source) at 
> java.util.Scanner.nextInt(Unknown Source)  at 
> java.util.Scanner.nextInt(Unknown Source)  at 
> com.register.main.Menu.registers(Menu.java:24) at 
> com.register.main.Menu.registers(Menu.java:31) at 
> com.register.main.Menu.menu(Menu.java:134) at 
> com.register.main.Main.main(Main.java:14) 

https://github.com/JakubKacperski/Register

+0

因此,在初始化它之前,您有一個對象調用實例成員(方法),然後您對不存在的變量調用實例成員(方法)。 – Stultuske

+0

任何想法如何解決它?我真的很熟悉Java,因爲你可以看到;) –

+0

實例化變量,並在調用它時使用正確的變量名稱 – Stultuske

回答

0

添加一個檢查,如果目錄「註冊」存在於你的CreateFile類方法showYears()

File yearsDirs = new File("Registers"); 

    if (!yearsDirs.exists()){ //Create "Registers" when it does not exists. 
     yearsDirs.mkdir(); 
    } 

    File[] dirs = yearsDirs.listFiles(); 

    for (File dir : dirs) { 
     if (dir.isDirectory()) { 
      System.out.print("Registers "); 
     } else { 
      System.out.print("Register "); 
     } 
     try { 
      System.out.println(dir.getName()); 
     } catch (Exception e) { 
      System.out.println("Error."); 
     } 
    } 

如果沒有檢查,調用.listFiles()導致目錄「Registers」不存在時會得到NullPointerException。 在Eclipse中,您的項目註冊表中可能有一個目錄「Registers」。當從終端呼叫時,你可能沒有。


每OP的評論:你可以編寫一個循環:

public class Main { 

    public static void main(String[] args) { 

     Menu newMenu = new Menu(); 

     boolean continuePlaying = newMenu.menu(); 

     while (continuePlaying) { 
      continuePlaying = newMenu.menu(); 
     } 
    } 

} 

,改變你的方法menu()的返回類型boolean而不是void


此外,您正在使用多個 Scanner s。我建議只使用一個。當你關閉 Scanner時,它看起來也會關閉其他的。在你的方法 createYear()CreateFile你最後打電話 reader.close()。當我刪除該行時,上面的循環完美地工作。當我放過它時,我會得到一個 NoSuchElementException

+0

好吧,但爲什麼調用方法後showYears()我不能'回到寄存器(); ?還有其他方法可以回到菜單嗎? –

+0

@JakubKacperski發生異常後,您的程序將停止。如果'dirs == null',你可以添加一個空檢查。我會更新代碼。 –

+0

@JakubKacperski您可以檢查「寄存器」是否存在,而不是空檢查。我更新了代碼。 –

相關問題