2016-09-15 2 views
-4

Ich versuche, eine Eingabezeichenfolge in ein Array aufzuteilen und dann etwas mit jedem Index des Arrays zu tun; Allerdings scheint das Array immer nur Größe 1 zu haben, egal wie viele Teile meine Saite hat.ArrayIndexOutOfBoundsException nach String.split (\ s)

Hier ist der Code:

public void game() { 

     // print prompt and take input 
     System.out.print(">"); 
     String string1 = in.next(); 

     while (string1.length() != 0) { 

     // splitting newArray into command and arguments 
     String[] newArray = new String[4]; 
     newArray = string1.split("\\s+"); 

     String command = newArray[0]; 
     String newString = newArray[1]; 
     String newString2 = newArray[2]; 
     if (newString != null && newString2 != null){ 
      int arg1 = Integer.parseInt(newString); 
      int arg2 = Integer.parseInt(newString2); 
      Cell c = cells[arg1][arg2]; 

      if (command == "u") { 
       if (c.getMarked() == true) { 
        break; } // end if 
       else if (c.getMined() == true) { 
        uncoverAll(); 
        System.out.println("You lose!"); 
        break; } // end else if 
       else { 
        c.setUncovered(); 
        if (allMinesMarked() == true && allNonMinesUncovered() == true) { 
        System.out.println("You win!"); 
        break; 
        } // end if 
       } // end else 
      } // end if for "u" 
      else if (command == "m") { 
       if (c.getCovered() == false) { 
        break; } // end if 
       else if (c.getMarked() == true) { 
        c.setMarked(true); } // end else if 
       else { 
        c.setMarked(true); 
        if (allMinesMarked() == true && allNonMinesUncovered() == true) { 
        System.out.println("You win!"); 
        break; 
        } // end if 
       } // end else 
      } // end else if for "m" 
     } // end if 
     else if (command == "show") { 
      show(); // prints the board 
     } 
     else if (command == "q") { 
      break; // exits while loop 
     } 

     else { 
      System.out.println("Bad command."); 
     } 

     System.out.print(">"); 
     string1 = in.next(); 
     } // end while   
    } // end game() 

Stacktrace:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at MineSweeper.game(MineSweeper.java:215) 
    at MineSweeper.play(MineSweeper.java:271) 
    at Driver.main(Driver.java:4) 

Was ich versuche zu erreichen newArray in einen 'Befehl' (newArray[0]) zu spalten, und 'Argumente' (newArray[1 and 2]). Wenn keine Argumente vorhanden sind, wird der erste Codeabschnitt übersprungen. Wenn Argumente vorhanden sind, wird der Code ausgeführt. Aber was auch immer ich in die Befehlszeile eintippe, bekomme ich die ArrayIndexOutOfBoundsException.

Gibt es eine Möglichkeit, den spezifischen Index des Arrays auf null festzulegen, wenn es nicht durch string1.split("\\s+") kommt? Ich habe versucht, -1 zum split() Eintrag hinzuzufügen, aber es hat nichts getan.

Antwort

3

in.next(); liest nur das erste Leerzeichen. Wenn Sie mehrere Wörter lesen möchten, verwenden Sie in.nextLine(), und dann wird dies wie erwartet funktionieren.

String[] newArray = string1.split("\\s+"); 

Dann Ihre spätere Probleme zu lösen, lesen Sie bitte How to compare Strings in Java

+0

Danke. Das funktioniert, wenn ich 3 Wörter eingabe, aber ich bekomme immer noch den Fehler, wenn String1 nur 1 Wort hat. Ich weiß es, weil es bei newArray [1] oder newArray [2] nichts gibt, gibt es also eine Möglichkeit, diese Indizes einfach auf null zu setzen? oder sie ignorieren, wenn nur 1 Wort eingegeben wird? – tylerhunter1

+0

Wenn Sie nur ein Wort eingeben, erzeugt die angegebene Codezeile nur ein Array der Größe 1. Sie müssen die 'new String [4]' nicht vorinitialisieren –

+0

Wenn ich verstehe, was Sie versuchen zu tun , dann solltest du vielleicht die Länge des Arrays überprüfen, bevor du versuchst, 'newArray [1]' oder 'newArray [2]' –

Verwandte Themen