为什么我的SmarterSorter程序会出现NullPointerException?

时间:2014-11-15 01:17:08

标签: java nullpointerexception bluej karel

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

我无法弄清楚原因。

感谢您的帮助!

1 个答案:

答案 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] = ;行。