2010-04-16 5 views
0

Я получил сообщение об ошибке, и я не совсем уверен, что случилось:исключения нулевого указателя сравнения двух строк в Java

Exception in thread "main" java.lang.NullPointerException 
    at Risk.runTeams(Risk.java:384) 
    at Risk.blobRunner(Risk.java:220) 
    at Risk.genRunner(Risk.java:207) 
    at Risk.main(Risk.java:176) 

Вот соответствующие биты кода (я будет обратить внимание на номера строк в сообщение об ошибке с помощью комментариев в коде, а также входы я поставил в программу во время ее работы в соответствующих случаях)

public class Risk 
{ 

...

public static void main (String[]arg) 
{ 
    String CPUcolor = CPUcolor() ; 
    genRunner (CPUcolor) ; //line 176 

...

} 

...

public static void genRunner (String CPUcolor) // when this method runs i select 0 and run blob since its my only option. Theres nothing wrong with this method so long as i know, this is only significant because it takes me to blob runner and because another one of our relelvent line numbers apears. 
{ 
    String[] strats = new String[1] ; 
    strats[0] = "0 - Blob" ; 
    int s = chooseStrat (strats) ; 
    if (s == 0) blobRunner (CPUcolor) ; // this is line 207 
} 

...

public static void blobRunner (String CPUcolor) 
{ 
    System.out.println ("blob Runner") ; int turn = 0 ; boolean gameOver = false ; 
    Dice other = new Dice ("other") ; 
    Dice a1 = new Dice ("a1") ; Dice a2 = new Dice ("a2") ; Dice a3 = new Dice ("a3") ; 
    Dice d1 = new Dice ("d1") ; Dice d2 = new Dice ("d2") ; 
    space (5) ; 
    Territory[] board = makeBoard() ; 
    IdiceRoll (other) ; 
    String[] colors = runTeams(CPUcolor) ; //this is line 220 
    Card[] deck = Card.createDeck() ; 
    System.out.println (StratUtil.canTurnIn (deck)) ; 

    while (gameOver == false) 
    { 
     idler (deck) ; 
     board = assignTerri (board, colors) ; 
     checkBoard (board, colors) ; 
    } 
} 

...

public static String[] runTeams (String CPUcolor) 
{ 
    boolean z = false ; 
    String[] a = new String[6] ; 
    while (z == false) 
    { 
     a = assignTeams() ; 
     printOrder (a) ; 
     boolean CPU = false ; 
     for (int i = 0; i<a.length; i++) 
     { 
      if (a[i].equals(CPUcolor)) CPU = true ; //this is line 384 
     } 
     if (CPU==false) 
     { 
      System.out.println ("ERROR YOU NEED TO INCLUDE THE COLOR OF THE CPU IN THE TURN ORDER") ; 
      runTeams (CPUcolor) ; 
     } 
     System.out.println ("is this turn order correct? (Y/N)") ; 
     String s = getIns() ; 
     while (!((s.equals ("y")) || (s.equals ("Y")) || (s.equals ("n")) || (s.equals ("N")))) 
     { 
      System.out.println ("try again") ; 
      s = getIns() ; 
     } 
     if (s.equals ("y") || s.equals ("Y")) 
     z = true ; 
    } 
    return a ; 
} 

...

} // This } closes the class 

Причина, по которой я не думаю, что должен получить Null: pointerException, потому что в этой строке: a[i].equals(CPUcolor) a по индексу i содержит строку, а CPUcolor - это строка. И в этот момент определенно значение не равно null. Может кто-нибудь, пожалуйста, скажите мне, что происходит не так?

ответ

2

вы должны взглянуть на метод assignTeams(). для некоторого значения i, a[i] должно быть null. не имеет значения, имеет ли значение CPUcolor значение null, метод equals обрабатывает это.

+0

Вы были правы [0]. Меняя мою позицию, которая сравнивала две строки так, что я начал с 1 исправил проблему – David

+0

@David - Я рад, что вы избавились от исключения, но изменит ли нижний предел цикла for вашу программу правильно? Вы действительно собираетесь иметь только команды * 5 *? – JeffH

+0

метод assign commands возвращает массив строк длиной 7. Первый массив заброшен. – David

1

assignTeams() возвращает массив с нулевыми значениями. Или хотя бы один из них имеет значение NULL. Вы должны это проверить. Можете ли вы отладить код?

2

Используйте отладчик и пройдите через свой код, поместите точку останова по строке 384. Это должно сказать вам, что не так.

 Смежные вопросы

  • Нет связанных вопросов^_^