【问题标题】:Why do I get a NullPointerException for my SmarterSorter program?为什么我的 SmarterSorter 程序会出现 NullPointerException?
【发布时间】:2015-01-12 12:29:02
【问题描述】:

我正在将 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。

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。

我不知道为什么。

感谢您的帮助!

【问题讨论】:

  • 灰色框外的括号应该在里面。
  • 由于某种原因,某些代码不会进入灰色框!从 import java.util.Arrays 到最后一个括号都应该在框中。
  • 所以您需要向我们展示 turnRight() 方法及其作用。如果您说在调用该方法时得到一个空指针。要么,要么您需要验证您是否正确使用了此 GoHomeBot。

标签: java nullpointerexception bluej karel


【解决方案1】:

让我们看看下面的方法:

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

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

那么你怎么能解决这个问题......再次查看方法transferToBeepers。如您所见,它返回提到的numBeepers 的本地版本,但您当前忽略了该返回值。所以把上面几行改成如下:

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

这样,您将使用transferToBeepers 的结果初始化全局numBeepers 版本,并且在sortTheBeepers(numBeepers) 调用期间它不会是null

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多