我正在尝试使用Java创建战舰游戏。实际的游戏可行,但是在此过程中我遇到了一个令人惊讶的问题(对我而言)。下面的代码从49个值的网格中生成一个随机位置,用户必须从中猜测。作为调试工具,我认为我会打印出ArrayList的数字值的索引,但是我得到了-1(发现这意味着找不到值)。考虑到我的数学正确,为什么它没有返回数字?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class GameHelper
{
String alphabet = "abcdefg";
private int gridLength=7;
private int gridSize=49;
private int [] grid = new int [gridSize];
private int comCount=0;
public String getUserInput(String prompt)
{
String inputLine=null;
System.out.println(prompt);
try
{
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
inputLine=is.readLine();
if (inputLine.equals(null))
{
return null;
}
}
catch(IOException e)
{
System.out.println("Buffered Reader Failure");
}
return inputLine;
}
public ArrayList <String> placeDotCom (int size)
{
ArrayList <String> alphaCells = new ArrayList <String>();
String temp=null;
int [] coords=new int[size];
int attempts=0;
boolean success=false;
int location=0;
comCount++;
int incr=1;
if((comCount%2)==1)
{
incr=gridLength;
}
while (!success & attempts++ < 200)
{
location = (int)(Math.random()*gridSize);
int x=0;
success=true;
while (success && x < size)
{
if (grid[location] ==0)
{
coords[x++]=location;
location+=incr;
if(location >= gridSize)
{
success = false;
}
if(x>0 && (location % gridLength ==0))
{
success = false;
}
}
else
{
System.out.println("used" + location);
success=false;
}
}
}
int x=0;
int row=0;
int column=0;
while(x < size)
{
grid[coords[x]] = 1;
row = (int)(coords[x]/gridLength);
column = coords[x] % gridLength;
temp = String.valueOf(alphabet.charAt(column));
alphaCells.add(temp.concat(Integer.toString(row)));
x++;
}
System.out.println("coord "+x+" = "+alphaCells.get(x-1));
return alphaCells;
}
}
我的未接来电:
for (DotCom dcset : dc)
{
ArrayList <String> newLocation = helper.placeDotCom(3);
dcset.setLocationCells(newLocation);
System.out.println(newLocation.indexOf(1));
}
我认为这是唯一相关的代码。如果您希望我发布更多信息,请告诉我。这是我第一次发帖,我不确定我是否正确地问了这个问题。这太模糊了吗?
答案 0 :(得分:3)
来自the documentation of ArrayList#indexOf(Object o)
返回指定元素在此列表中首次出现的索引,如果该列表不包含该元素,则返回
-1
。更正式地,返回最低索引i
,使Objects.equals(o, get(i))
或-1
(如果没有这样的索引)。
请注意,该方法期望使用Object
作为参数(这是有历史原因的,它源于Java没有泛型且所有容器都使用Object
的黑暗时代)。
现在,您声明了ArrayList <String> newLocation
并在该对象上调用.indexOf(1)
。传递的int
值将autoboxed放入Integer
中。由于您的newLocation
列表仅包含String
,因此在列表中找不到传递的Integer
。因此,它返回一个-1
。
关于您的代码的注释:当我写in my comment时,inputLine.equals(null)
将返回false
(如果inputLine
不是null
)或抛出{ {1}}(如果NullPointerException
是inputLine
)。这是由于以下事实:如果程序尝试访问null
引用上的属性或方法,则会抛出null
。只需输入NullPointerException
(在这种情况下,inputLine == null
是正确的)。一种替代解决方案是proposed by Szychan in the comments:您可以使用Objects.isNull(inputLine)
来检查==
是否为inputLine
。