2017-09-21 11 views
-1

入力されたコードネームとパスワードをテキストファイルに保存されているものと照合するコードスニペットがあります。一致するものがあればゲームを開始し、すべてが正常です。しかし、一致するものがなければ、再びログインしようとするかどうかを尋ねるダイアログがポップアップされるはずです。forループ後のコードが実行されない(Java)

int input=0; //yes 

do { 
    codename=JOptionPane.showInputDialog(null,"Enter Codename: "); 
    String password=JOptionPane.showInputDialog(null, "Enter Password: "); 

    for(int i=0;i<users.length;i++){ 
     if((codename.equals(users[i].getCodeName())) && (password.equals(users[i].getPassword()))){ 
      System.out.println("\n\nCorrect"); 
      new Game(); 
     } else { 
      System.out.println("\n\nIncorrect"); 
     } 
    } 
    input = JOptionPane.showConfirmDialog(null, "Incorrect User name/Password\nWould you like to try again?");   
} while(input==0); //run while input is yes 

問題:ループが実行されないために後のコード。私はユーザーに対して[私は]のための変数をチェックすると、forループの後のコードは実行されませんが、私は[]などのユーザーに対してチェックし、それはうまく動作します。

この問題であればわからないが、私はいつもこのエラーが出る:

Exception in thread "main" java.lang.NullPointerException 
    at com.ramtin.Game.logOn(Game.java:505) 
    at com.ramtin.Game.main(Game.java:397) 

は私がパスワードとコードネームが一致し、プログラムを完全に実行しても、それを得ます。

上記のコードのための

FULL CODE:UserDataのため

public static void logOn(){ 
     //ASK FOR CODENAME & PASSWORD FROM TEXTFILE BEFORE GAME BEGINS 
     //read from text file 

     UserData[]users=new UserData[20]; 
     int countU=0; 

     try{ 
      BufferedReader readU = new BufferedReader(new FileReader("userdata.txt")); 

      String line; 

      while((line=readU.readLine())!=null){ 
       String []parts=line.split("#"); 

       String codeName = parts[0]; 
       String password=parts[1]; 

       //    System.out.println(parts[0]); 
       //    System.out.println(parts[1]); 
       users[countU]=new UserData(codeName, password); 
       countU++; 
      } 
      readU.close(); 
     } 
     catch(FileNotFoundException e){ 

     } 
     catch(IOException e){ 

     } 

     //PASSWORD & CODENAME 

     int input=0; //yes 

     do{ 
      codename=JOptionPane.showInputDialog(null,"Enter Codename: "); 
      String password=JOptionPane.showInputDialog(null, "Enter Password: "); 

      for(int i=0;i<users.length;i++){ 
       if((codename.equals(users[i].getCodeName()))&&(password.equals(users[i].getPassword()))){ 
        System.out.println("\n\nCorrect"); 
        new Game(); 
       } 
       else{ 
        System.out.println("\n\nIncorrect"); 
       } 
      } 

      input = JOptionPane.showConfirmDialog(null, "Incorrect Username/Password\nWould you like to try again?");   
     } 
     while(input==0); //run while input is yes 
    } 
} 

FULL CODE:

public class UserData { 

    private String codename; 
    private String password; 

    UserData (String codeName, String password) 
    { 
     this.codename = codeName; 
     this.password= password; 
    } 


    String getCodeName() 
    { 
     return codename; 
    } 


    String getPassword() 
    { 
     return password; 
    } 


    public String toString() 
    { 
     String temp = "\nCode name: "+codename+"\nPassword: " + password; 
     return temp; 
    } 
    } 
+0

ユーザーアレイはどのように見えますか?インデックス2より前のユーザーには、あなたが思うものが含まれていないため、例外がスローされるように思えます。コンソールの実行が終了したらどうなるでしょうか?パスワード/コードネームが間違っているとき –

+0

@MasterYoda それはこのことを言う: java.lang.NullPointerExceptionがcom.ramtin.Game.logOn(Game.java:505)com.ramtin.Game.mainで \t(で \t Game.java:397) それは正しいと同じことを言うが、それはゲームを開始し、すべて正常に動作する。 users配列は、Stringコード名とStringパスワード変数を保持するクラス図で構成されます。 – badProgrammer

+0

画面397または505のいずれかの行ですか? – JensS

答えて

0

for(int i=0;i<users.length;i++){

をしないでくださいは、後for(int i=0;i<countU;i++){

すべての配列要素をしますかcountUを呼び出すとNPEが発生します。代わりに、長さが20で配列を使用してのusers[i].getCodeName()

+0

ありがとうございました!それが問題を解決しました。私はそのような愚かな誤りを信じることができません。しかし、今私は、JOptionPaneが、開始されたゲームよりもパスワードが間違っていると表示しているという問題があります。 whileループは、入力= 0の場合にのみ実行しました。なぜそれがそれを行うのかはわかりません。それに対する解決策はありますか? – badProgrammer

+0

'input password'は、' 'bad password ''オプションダイアログが表示された後、変更されるまで常に0になります。 – geneSummons

+0

**編集**ポップアップの問題を解決しました。 do whileループから抜け出すだけでした。助けてくれてありがとう。 – badProgrammer

0

などのヌル要素の方法、それは動的に拡大するとして、あなたはArrayListのを使用することができます。

List<UserData> users = new ArrayList<>(); 

を次にリスト

users.add(new UserData(codeName, password)); 
に、各ユーザデータを追加

for(int i=0 ;i<users.size(); i++) { 

を繰り返す。これは防ぐことができますNullPointerは、ユーザー数と同じ数のエントリしか持たないため(ユーザーの数に応じて動的に拡大/縮小されます)

+0

ありがとう、@ geneSummonsの解決策は私のために働いた。しかし、私はエラーを防ぐためにリストを使用します。 – badProgrammer

+0

うれしい私は助けることができます。 – JensS

関連する問題