-1

我正在将 BlueJ 与 Karel the Robot 一起使用。

该程序称为 SmarterSorter,以下是说明:(我需要对该程序的所有帮助,而不仅仅是 NullPointerException)。

背景:存在未知数量的垂直蜂鸣器(无间隙)——每个垂直蜂鸣器中有未知数量的蜂鸣器(每个角落一个蜂鸣器——无间隙)。最左侧桩的底部蜂鸣器始终位于原点。

我故意不给你子弹形式的算法(所以你不能只是把子弹变成方法)。我假装自己是最终用户(即,计算机编程方面的准智力——所以,我将用英语来描述这个问题)。

所以,这里的算法:

SmarterSorterRobot(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。在第一个即将创建的蜂鸣器堆的底部创建一个 PUR——PUR 应该知道它将要放置多少个蜂鸣器(最近排序数组中的最小数字)。然后,PUR 应该以最有效的方式将所有蜂鸣器放回原处(如下所述)。SSR 现在应该创建第二个 PUR 并让它做同样的事情 - 继续直到所有堆都放置好(即所有堆现在都按非降序排序并且所有 PUR 都在 HOME 位置)。SSR 现在应该要求每个 PIR 回家。最后,SSR 现在应该返回 HOME。在第一个即将创建的蜂鸣器堆的底部创建一个 PUR——PUR 应该知道它将要放置多少个蜂鸣器(最近排序数组中的最小数字)。然后,PUR 应该以最有效的方式将所有蜂鸣器放回原处(如下所述)。SSR 现在应该创建第二个 PUR 并让它做同样的事情 - 继续直到所有堆都放置好(即所有堆现在都按非降序排序并且所有 PUR 都在 HOME 位置)。SSR 现在应该要求每个 PIR 回家。最后,SSR 现在应该返回 HOME。SSR 现在应该创建第二个 PUR 并让它做同样的事情 - 继续直到所有堆都放置好(即所有堆现在都按非降序排序并且所有 PUR 都在 HOME 位置)。SSR 现在应该要求每个 PIR 回家。最后,SSR 现在应该返回 HOME。SSR 现在应该创建第二个 PUR 并让它做同样的事情 - 继续直到所有堆都放置好(即所有堆现在都按非降序排序并且所有 PUR 都在 HOME 位置)。SSR 现在应该要求每个 PIR 回家。最后,SSR 现在应该返回 HOME。

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。

我不知道为什么。

谢谢您的帮助!

4

1 回答 1

0

让我们看看下面的方法:

public void sortBeepers()
{
    // ..
    transferToBeepers();
    sortTheBeepers(numBeepers);
    // ..
}

它调用transferToBeepers()正在使用本地numBeepers数组执行某些操作的方法,然后您使用sortTheBeepers不同的(这次是全局)变量进行调用numBeepers。这个numBeepers版本仍然是null,因为它之前从未初始化,因此该行由于调用而for (int i=0; i<numBeepers.length; i++)抛出(即)。NullPointerExceptionnumBeepers.lengthnull.length

那么如何解决这个问题……transferToBeepers再看看方法。如您所见,它返回提到的本地版本numBeepers,但您当前忽略了该返回值。因此,将上述行更改如下:

public void sortBeepers()
{
    // ..
    numBeepers = transferToBeepers();
    sortTheBeepers(numBeepers);
    // ..
}

这样,您将numBeepers使用结果初始化全局版本,transferToBeepers并且不会nullsortTheBeepers(numBeepers)调用期间进行。

顺便说一句,您还应该修复方法numBeepers [i] = ;中的行transferToBeepers

于 2014-11-15T01:27:15.927 回答