我正在使用BlueJ和Karel the Robot。
该程序名为SmarterSorter,以下是说明:(我需要对程序提供一些帮助,而不仅仅是NullPointerException)。
背景:有一些未知数量的垂直堆蜂鸣器(没有间隙) - 每个垂直堆中都有未知数量的蜂鸣器(每个角落一个蜂鸣器 - 没有间隙)。最左边一堆的底部蜂鸣器始终位于原点。
我故意不以子弹形式给你算法(所以你不能把子弹变成方法)。我假装我是最终用户(即计算机编程方面的准智力 - 所以,我将用英语描述问题)。
所以,这是算法:
SmarterSorterRobot(SSR)进行排序。然而,她有一些助手(代表) - PutterRobot(PUR)和PickerRobot(PIR)。 SSR知道她总是从面向东方开始,并且站在最左边的垂直堆中最底部的蜂鸣器上。她开始沿着所有垂直桩的底排行走,当她到达一个空角落时停下来。然后,她创建所有那些PIR,然后,在它们全部创建之后,依次命令每个PIR拾取它们各自堆中的所有蜂鸣器(例如,如果第一个垂直桩中的PIR有5个以上的蜂鸣器他,他将站在他原来的6个角落,拿起6个蜂鸣器)。 SSR现在应该向每个PIR查询它所拾取的蜂鸣器数量,并且她应该将这些计数存储到一个java数组中。然后她应该对该数组进行排序(参见Arrays的API)。她现在应该再次从左到右工作,在第一批即将创建的蜂鸣器底部创建一个PUR - PUR应该知道它将要放多少个蜂鸣器(最近排序的最小数量)数组)。然后,PUR应该以最有效的方式放置所有蜂鸣器并进入HOME(如下所述)。 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。
我无法弄清楚原因。
感谢您的帮助!
答案 0 :(得分:0)
让我们看看以下方法:
public void sortBeepers()
{
// ..
transferToBeepers();
sortTheBeepers(numBeepers);
// ..
}
它调用方法transferToBeepers()
,该方法使用本地numBeepers
数组执行某项操作,然后使用不同的(此时为全局)变量sortTheBeepers
调用numBeepers
。此numBeepers
版本仍为null
,因为它之前从未初始化,因此for (int i=0; i<numBeepers.length; i++)
行会因NullPointerException
调用而引发numBeepers.length
(即{{ 1}})。
那么如何解决这个问题......再次查看方法null.length
。如您所见,它返回提到的transferToBeepers
的本地版本,但您当前忽略了返回的值。因此,请按以下方式更改上述行:
numBeepers
这样,您正在初始化全局public void sortBeepers()
{
// ..
numBeepers = transferToBeepers();
sortTheBeepers(numBeepers);
// ..
}
版本,其结果为numBeepers
,并且在transferToBeepers
调用期间不会null
。
顺便说一句,您还应该修复sortTheBeepers(numBeepers)
方法中的numBeepers [i] = ;
行。