#java #nullpointerexception #string-comparison
#java #исключение nullpointerexception #сравнение строк
Вопрос:
Я получил это сообщение об ошибке, и я не совсем уверен, что не так:
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 — это строка. Обе на данный момент определенно имеют значение, ни одна из которых не является нулевой. Кто-нибудь, пожалуйста, может сказать мне, что происходит не так?
Ответ №1:
вам следует взглянуть на метод assignTeams()
. для некоторого значения i
, a[i]
должно быть null. не имеет значения, имеет ли CPUcolor
значение null, метод equals
обрабатывает это.
Комментарии:
1. вы были правы, [0] равно нулю. Изменение моего состояния for, в котором сравнивались две строки, так что я начал с 1, устранило проблему
2. @David — Я рад, что вы избавились от исключения, но оставляет ли изменение нижней границы цикла for вашу программу корректно работающей? Вы действительно собираетесь использовать только 5 команд?
3. метод assign teams возвращает массив строк длиной 7. Первый массив заброшен.
Ответ №2:
Используйте отладчик и пошагово выполните свой код, поставив точку останова в строке 384. Это должно подсказать вам, что не так.
Ответ №3:
assignTeams() возвращает массив с нулевыми записями. Или, по крайней мере, одна из них равна null. Вы должны это проверить. Можете ли вы отладить код?