2016-09-24 3 views
0

私の問題は次のとおりです。 メソッドnewFile.createYear();メニュー端末のスイッチからエラーが表示される:メニュークラスのスイッチからメソッドを呼び出すときのスレッド "main"の例外

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

したがって、初期化する前にインスタンスメンバー(メソッド)を呼び出すオブジェクトが1つあり、存在しない変数に対してインスタンスメンバー(メソッド)を呼び出すとします。 – Stultuske

+0

どのようなアイデアを私はそれを修正することができますか?私はあなたが見ることができるようにJavaで本当に新鮮です;) –

+0

変数をインスタンス化し、何かを呼び出すときに正しいvariablenameを使用します。 – Stultuske

答えて

0

showYears()のクラスCreateFileにディレクトリがある場合にチェックを追加します。

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()を呼び出すとNullPointerExceptionが発生します。 Eclipseでは、おそらくプロジェクトRegisterの下に「Register」というディレクトリがあります。端末から呼び出されると、おそらくそうではないでしょう。 OPのコメントパー


:あなたのようなループ記述することができます。

public class Main { 

    public static void main(String[] args) { 

     Menu newMenu = new Menu(); 

     boolean continuePlaying = newMenu.menu(); 

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

} 

をそしてboolean代わりのvoidにあなたの方法menu()の戻り値の型を変更します。


また、複数の Scannerを使用しています。私は1つを使用することをお勧めします。 Scannerを閉じると、他のものも閉じているように見えます。あなたのメソッド createYear()CreateFileの場合は、最後に reader.close()と呼んでください。その行を削除すると、上記のループは完全に機能します。私はそれをそのままにすると、あなたのような NoSuchElementExceptionが得られます。

+0

しかし、なぜshowYears()メソッドを呼び出した後、私はレジスタに戻ることはできません。 ?メニューに戻る別の方法はありますか? –

+0

@ JakubKacperski例外がキャッチされないと、プログラムは停止します。 'dirs == null'ならヌルチェックを追加できます。私はコードを更新します。 –

+0

@JakubKacperskiヌルチェックの代わりに、 "レジスタ"が存在するかどうかを確認できます。コードを更新しました。 –

関連する問題