2017-05-03 11 views
1

Ich habe ein Projekt für meine Programmierung Klasse in der Schule, wo wir angeblich ein böses Henker Spiel zu machen, das ist, wo der Computer kein Wort holen, bis er hat. Um den Benutzer zu denken, dass er fair spielt, berücksichtigt der Computer nur Wörter mit dem gleichen Buchstabenmuster.Warum erhält mein Array ArrayIndexOutOfBoundsException?

Ich habe etwas, das meiner Meinung nach funktionieren sollte, aber nachdem ich nur die Buchstaben "a" und "e" erraten habe, hat mein Array eine ArrayIndexOutOfBoundsException und ich habe versucht, es in den letzten paar Stunden mit einem Debugger herauszufinden sehe das Problem immer noch nicht und ich meine, die ganze Klasse arbeitet für den ersten Buchstaben, aber es bricht nur beim zweiten. Es passiert, wenn ich das MusterArr [indexOfMax] am Ende der HangmanManager-Klasse zurückgebe. Warum funktioniert es nicht so, wie ich es erwarte?

Dies ist ein Link auf die Wörterbuchdatei I verwendet haben (Sie eine Textdatei mit einem Bündel von Wörtern in es für das Spiel verwenden, muss arbeiten): http://www-personal.umich.edu/~jlawler/wordlist.html

Hier ist mein Programm:

HangmanManager Klasse

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 
import java.util.Set; 
import java.util.SortedSet; 
import java.util.TreeSet; 

public class HangmanManager { 
    private SortedSet<String> wordset; 
    private SortedSet<Character> guessSet; 
    private String wordPattern; 
    private int guessesLeft; 



    public HangmanManager(List<String> dictionary, int length, int max){ 
     if(length < 1 || max < 0) { 
      throw new IllegalArgumentException(); 
     } 
     wordset = new TreeSet<String>(); 
     for(String words: dictionary) { 
      if(words.length() == length) { 
       wordset.add(words); 
      } 
     } 
     wordPattern = ""; 
     for (int i = 0; i < length; i++) { 
      wordPattern += "- "; 
     } 
     guessesLeft = max; 
     guessSet = new TreeSet<Character>(); 

    } 
    //Returns the managers words 
    public Set<String> words() { 
     return wordset; 
    } 

    //Returns the number of guesses left 
    public int guessesLeft() { 
     return guessesLeft - guessSet.size(); 
    } 

    //Returns the guessed letters 
    public SortedSet<Character> guesses() { 
     return guessSet; 
    } 

    //Returns String pattern 
    public String pattern() { 
     return wordPattern; 
    } 
    public int record(char guess) { 
     guessSet.add(guess); 
     return comparePatterns(wordset, guess); 
    } 

    private String makePattern(char guess, String word) { 
     String position = ""; 
     char[] letters = word.toCharArray(); 
     for (int i = 0; i < word.length(); i ++) { 
      if (letters[i] == guess) { 
       position = position + guess + " "; 
      } else { 
       position = position + "- "; 
      } 
     } 
     return position; 
    } 
    //This method is supposed to take out all the patterns that don't match 
    // the String commonPattern 
    private int comparePatterns(SortedSet<String> mySet, char guess) { 
     String[] wordArray = new String[mySet.size()]; 
     wordArray = (String[]) mySet.toArray(wordArray); 
     String[] patternArray = new String[wordArray.length]; 
     List<String> tempList = new ArrayList<String>(); 
     for(int i = 0; i < wordArray.length; i++) { 
      patternArray[i] = makePattern(guess, wordArray[i]); 
     } 
     String commonPattern = getMostCommonPattern(guess, patternArray); 

     int rightGuess = 0; 
     for(int i = 0; i > commonPattern.length(); i ++) { 
      if(commonPattern.charAt(i) == guess) { 
       rightGuess++; 
      } 
     } 
     for(int j = 0; j < patternArray.length; j++) { 
      if(commonPattern.equals(patternArray[j])) { 
       tempList.add(wordArray[j]); 
      } 
     } 
     wordset.removeAll(wordset); 
     wordset.addAll(tempList); 
     return rightGuess; 
    } 
    //This method gets the most common pattern 

    //THIS METHOD BREAKS 
    private String getMostCommonPattern(char guess, String[] patternArr) { 
     List<String> patternList = Arrays.asList(patternArr); 
     int[] countArray = new int[patternArr.length]; 
     for(int i = 0; i < patternArr.length; i++) { 
      countArray[i] = Collections.frequency(patternList, patternArr[i]); 
     } 


     int max = 0; 
     int indexOfMax = 0; 
     for (int j = 0; j < countArray.length; j++) { 
      if(max < countArray[j]) { 
       max = countArray[j]; 
       indexOfMax = j; 
      } else if (max > countArray[j]) { 

      }else if (max == countArray[j]) { 

      } 
     } 

     return patternArr[indexOfMax]; 
    } 
} 

HangmanMain Klasse

import java.util.*; 
import java.io.*; 

public class HangmanMain { 
    public static final String DICTIONARY_FILE = "C:\\Users\\Zoratu\\Desktop\\EvilHangman\\dictionary.txt"; 
    public static final boolean DEBUG = false; // show words left 

    public static void main(String[] args) throws FileNotFoundException { 
     System.out.println("Welcome to the cse143 hangman game."); 
     System.out.println(); 

     // open the dictionary file and read dictionary into an ArrayList 
     Scanner input = new Scanner(new File(DICTIONARY_FILE)); 
     List<String> dictionary = new ArrayList<String>(); 
     while (input.hasNext()) { 
      dictionary.add(input.next().toLowerCase()); 
     } 

     // set basic parameters 
     Scanner console = new Scanner(System.in); 
     System.out.print("What length word do you want to use? "); 
     int length = console.nextInt(); 
     System.out.print("How many wrong answers allowed? "); 
     int max = console.nextInt(); 
     System.out.println(); 

     // set up the HangmanManager and start the game 
     List<String> dictionary2 = Collections.unmodifiableList(dictionary); 
     HangmanManager hangman = new HangmanManager(dictionary2, length, max); 
     if (hangman.words().isEmpty()) { 
      System.out.println("No words of that length in the dictionary."); 
     } else { 
      playGame(console, hangman); 
      showResults(hangman); 
     } 
    } 

    // Plays one game with the user 
    public static void playGame(Scanner console, HangmanManager hangman) { 
     while (hangman.guessesLeft() > 0 && hangman.pattern().contains("-")) { 
      System.out.println("guesses : " + hangman.guessesLeft()); 
      if (DEBUG) { 
       System.out.println(hangman.words().size() + " words left: " 
         + hangman.words()); 
      } 
      System.out.println("guessed : " + hangman.guesses()); 
      System.out.println("current : " + hangman.pattern()); 
      System.out.print("Your guess? "); 
      char ch = console.next().toLowerCase().charAt(0); 
      if (hangman.guesses().contains(ch)) { 
       System.out.println("You already guessed that"); 
      } else { 
       int count = hangman.record(ch); 
       if (count == 0) { 
        System.out.println("Sorry, there are no " + ch + "'s"); 
       } else if (count == 1) { 
        System.out.println("Yes, there is one " + ch); 
       } else { 
        System.out.println("Yes, there are " + count + " " + ch 
          + "'s"); 
       } 
      } 
      System.out.println(); 
     } 
    } 

    // reports the results of the game, including showing the answer 
    public static void showResults(HangmanManager hangman) { 
     // if the game is over, the answer is the first word in the list 
     // of words, so we use an iterator to get it 
     String answer = hangman.words().iterator().next(); 
     System.out.println("answer = " + answer); 
     if (hangman.guessesLeft() > 0) { 
      System.out.println("You beat me"); 
     } else { 
      System.out.println("Sorry, you lose"); 
     } 
    } 

Und danke, dass du dir die Zeit genommen hast, um einem Anfänger wie mir zu helfen.

+4

den Stacktrace lesen. Auf welcher Linie erhalten Sie die Ausnahme? Welchen Index benutzen Sie und welche Größe hat Ihr Array? – Simulant

+0

ein 'ArrayIndexOutOfBoundsException' ist man nur versucht, einen Index zuzugreifen, die nicht auf dem Array nicht vorhanden ist. So einfach ist das. Z.B. Sie haben 'Array {„A“,„B“,„C“}' dies ist ein Array mit einer Länge von 3, was bedeutet, dass Sie nur 0 Zugriff Indizes können, 1 und 2. Wenn für das Array, das Sie versuchen, Sie für den Zugriff auf Index 3 wird diesen Fehler erhalten. Sie müssen also herausfinden, wo Sie versuchen, auf einen nicht vorhandenen Index für das Array zuzugreifen. Folgen Sie den Anweisungen von @Simulant und Sie werden es herausfinden. –

+1

Auch in 'for (int i = 0; i> commonPattern.length(); i ++)' Schleife wird nie ausgeführt. –

Antwort

-1

Ausgangsleitungen an die Konsole oder Debug-Datei, so können Sie genau verfolgen, wo im Code der Dimensionen eines Arrays verletzt werden, oder die Ausnahme behandeln (lesen Sie auf Try-Catch).

Der Grund, warum man möchte dies tun, weil es das Debuggen, ohne dass die Entwickler-Tools erlaubt, da es Teil des Programms ist, und ermöglicht Endnutzern Fehlerberichte einzureichen. Das Erkennen dieser Art von Problemen bedeutet auch, dass Sie Code hinzufügen können, um es intern zu lösen, ohne dass der Benutzer es jemals bemerkt. Obwohl dies nur ein relativ einfaches Problem ist, das eine interne Lösung erfordert, können in der Zukunft einige Probleme auftreten, die system-, umwelt- oder benutzerspezifisch sind. Daher ist es besser, sich frühzeitig daran zu gewöhnen.

Dies sind ärgerliche Fehler zu begegnen, aber wirklich einfach zu lösen, wenn Sie sie finden. Es ist fast so, als würde man eine Klammer vergessen; Einfache a [zensiert] zu übersehen, zu verfolgen, und Sie finden sich schlagen, wenn Sie es finden, oder zumindest, das ist meine Erfahrung ;-)

https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html

+0

Willkommen bei Stack Overflow! Bitte lesen Sie [Wie schreibe ich eine gute Antwort?] (Http://stackoverflow.com/help/how-to-answer), bevor Sie versuchen, weitere Fragen zu beantworten. –

Verwandte Themen