为什么我的 SmarterSorter 程序会得到一个 NullPointerException



我正在使用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] = ;行。

相关内容

最新更新