我的战舰计划遇到了这个小问题。在我的测试仪中,我创建了一个船只对象[一个与pos1的起始位置垂直的驱逐舰(保持2个点)]以及一些测试人员:
public class BoatTester {
public static void main(String[] args) {
Position pos1 = new Position(4, 5);
Position pos2 = new Position(3, 5);
Boat ship1 = new Boat("Destroyer", pos1, "vertical");
//Hits the starting position as it is a definite hit
System.out.println("Hitting...");
ship1.hit(pos1);
System.out.println("Starting Position Hit? " + ship1.isHit(pos1)); //returns true
System.out.println("Ship Sunk? " + ship1.sunk(pos2)); //false, as the destroy has 2 spots
System.out.println("");
System.out.println("Hitting Other Position(s)...");
//This doesn't work
ship1.onBoat(pos2);
}}
在我的实际船只类(其中包含运行所有这些的代码)中,构造函数采用它的类型,起始位置(位置1)和方向,然后它将一个带有Position对象的数组填充到正确的斑点数量。
*注意位置obj,只有方法给出船的x和y位置。
**另请注意,代码会将数组位置[0]设置为起始位置(位置1)并从那里生成。
public class Boat {
private String name;
private Position location;
private String orientation;
private Position[] boat;
public Boat(String ship, Position p, String orien){
name = ship;
location = p;
orientation = orien;
boat = new Position[size()];
boat[0] = p;
if(orientation.equals("Vertical")) {
for(int i = 1; i < size(); i++) {
hold = new Position((location.rowIndex() + i), location.columnIndex());
boat[i] = hold;
}
}//Just the flipped of vertical
else if(orientation.equals("Horizontal")) {
for(int i = 1; i < size(); i++) {
hold = new Position(location.rowIndex(), (location.columnIndex() + i));
boat[i] = hold;
}
}
}
现在在这个Boat类中,当我调用另一个方法(不包括在内)来查看我从测试器传入的第二个位置是否存在时(假设它在那里)程序崩溃并出现错误说数组超出界限。我不明白为什么阵列没有第二个位置,因为看起来我的构造函数不是第二个位置obj。
*注意我尝试遵循礼仪并尽可能简洁,完整的代码可以在这里找到:https://docs.google.com/document/d/16Hp7Uu_-UZE3PwfQPurNIxl7CAzH8t2nEhUyB6Te_qc/edit?usp=sharing
**注2,我是学生,可能不知道java非常错综复杂的工作方式,所以请像我五岁那样解释。
编辑1:我的不好,这是例外:
Exception in thread "main" java.lang.NullPointerException
at Boat.onBoat(Boat.java:80)
at BoatTester.main(BoatTester.java:15)
Boat.onBoat上的那个只是我对阵列的船[1](第二个位置)的测试,显示那里什么都没有。
编辑2:这里是onBoat例外以澄清。
public boolean onBoat(Position spot){
//Throws and exception here when I check the second index of the array
System.out.println(boat[1].rowIndex()); //Specifically line 80
System.out.println(boat[1].columnIndex());
}
答案 0 :(得分:0)
for(int i = 1; i < size(); i++) {
hold = new Position((location.rowIndex() + i), location.columnIndex());
boat[i] = hold;
}
}//Just the flipped of vertical
else if(orientation.equals("Horizontal")) {
for(int i = 1; i < size(); i++) {
hold = new Position(location.rowIndex(), (location.columnIndex() + i));
boat[i] = hold;
}
好吧,你的for循环只能为i = 1做一个循环,因为战列舰的大小是2。
答案 1 :(得分:0)
这可能是你的问题。你应该使用name.equals(“Destroyer”);
public int size(){
if(name == "Aircraft Carrier"){
return 5;
}if(name == "Battleship"){
return 4;
}if(name == "Cruiser"){
return 3;
}if(name == "Destroyer"){
return 2;
}else{
return 3;
}
}
另外,您的尺寸函数可能以返回1;结束。我假设旧代码。
答案 2 :(得分:0)
Welp,这只是我愚蠢的案例之一。我使用.equals(&#34; Vertical&#34;)而不是.equalsIgnoreCase(&#34; Vertical&#34;),在测试器类中,我将它作为小写&#34;垂直&#34;所以它给了我一个错误。我很糟糕。