我正在使用BlueJ和Karel the Robot。
该程序称为SmarterSorter,以下是说明:(我需要一些关于该程序的帮助,而不仅仅是NullPointerException)。
背景:有未知数量的垂直蜂鸣器堆(没有间隙)——每个垂直桩中都有未知数量的蜂鸣器(每个角落一个蜂鸣器 – 没有间隙)。最左边桩的底部蜂鸣器始终在原点。
我故意不给你项目符号形式的算法(所以你不能只是把项目符号变成方法)。我假装自己是最终用户(即计算机编程方面的准智力 - 所以,我将用英语描述问题)。
所以,这是算法:
智能分拣机器人(SSR)进行分拣。然而,她有一些助手(代表) - PutterRobot(PUR)和PickerRobot(PIR)。SSR知道她总是面向东方开始,站在最左边垂直桩的最底部蜂鸣器上。她首先沿着所有垂直桩的底排走,当她到达一个空的角落时停下来。然后,她创建所有这些 PIR,然后在它们全部创建后,依次命令每个蜂鸣器拾取各自堆中的所有蜂鸣器(因此,例如,如果第一个垂直桩中的 PIR 在他上方有 5 个蜂鸣器,他将站在他所在位置上方 6 个角落,拾取 6 个蜂鸣器)。SSR 现在应该查询每个 PIR 以获取它拾取的蜂鸣器数量,并且她应该在将这些计数放入 java 整数数组时存储这些计数。然后,她应该对该数组进行排序(请参阅数组的 API)。她现在应该再次从左到右工作,在第一组即将创建的蜂鸣器堆的底部创建一个 PUR——PUR 应该知道它将要放置多少个蜂鸣器(最近排序数组中的最小数字)。然后,PUR应以最有效的方式放置所有蜂鸣器并回家(如下所述)。SSR 现在应该创建第二个 PUR 并让它做同样的事情——继续直到所有桩都放置完毕(即,所有桩现在都按非降序排序,所有 PUR 都处于 HOME 位置)。SSR 现在应该要求每个 PIR 回家。最后,SSR 现在应该回家了。
HOME:home是最左边垂直列中最顶部蜂鸣器的正北角。
这是我的代码:
import java.util.Arrays;
public class SmarterSorterRobot extends GoHomeBot
{
public SmarterSorterRobot(int av, int st, Direction dir, int beeps)
{
super(av, st, dir, beeps);
}
public int x =1;
private PickerRobot [] robot;
private PutterRobot [] bot;
private int numBeeps;
private int [] myPutterRobots;
private int [] numBeepers;
public int getNumBeeps()
{
return numBeeps;
}
public void sortBeepers()
{
turnRight();
countNumberOfRows();
robot = new PickerRobot [x];
createPickerRobots();
pickLotsOfBeepers();
transferToBeepers();
sortTheBeepers(numBeepers);
robot [x].goHome();
this.goHome();
}
public void countNumberOfRows()
{
while(nextToABeeper())
{
move();
x++;
}
}
public void createPickerRobots()
{
for (int i=1;i<robot.length;i++)
{
robot [i]= new PickerRobot (1,i,North,0);
}
}
public void pickBeepers()
{
while(nextToABeeper())
{
pickBeeper();
move();
numBeeps++;
}
}
public void pickLotsOfBeepers()
{
for (int i=1; i<robot.length; i++)
{
robot [i].pickBeepers();
}
}
public int[] transferToBeepers()
{
int [] numBeepers = new int [x];
for (int i=0; i<numBeepers.length;i++)
{
numBeepers [i] = ;
}
Arrays.sort (numBeepers);
return numBeepers;
}
public void sortTheBeepers(int [] numBeepers)
{
for (int i=0; i<numBeepers.length; i++)
{
PutterRobot robespierre = new PutterRobot (1, i, North, numBeepers [i]);
while(anyBeepersInBeeperBag())
{
putBeeper();
}
goHome();
}
}
}
我在sortTheBeepers方法的第一行得到一个NullPointerException。
我不知道为什么。
感谢您的帮助!
让我们看一下以下方法:
public void sortBeepers()
{
// ..
transferToBeepers();
sortTheBeepers(numBeepers);
// ..
}
它调用方法transferToBeepers()
该方法使用本地numBeepers
数组执行某些操作,然后使用不同的(这次是全局)变量numBeepers
调用sortTheBeepers
。这个numBeepers
版本仍然是null
的,因为它以前从未初始化过,NullPointerException
for (int i=0; i<numBeepers.length; i++)
因此由于调用numBeepers.length
(即 null.length
)。
那么如何解决这个问题...再看transferToBeepers
的方法。如您所见,它返回上述numBeepers
的本地版本,但您当前忽略了该返回值。因此,请按如下方式更改上述行:
public void sortBeepers()
{
// ..
numBeepers = transferToBeepers();
sortTheBeepers(numBeepers);
// ..
}
这样,您将使用 transferToBeepers
的结果初始化全局numBeepers
版本,并且在sortTheBeepers(numBeepers)
调用期间不会null
该版本。
顺便说一句,您还应该修复transferToBeepers
方法中的numBeepers [i] = ;
行。