나는 Karel the Robot과 함께 BlueJ를 사용하고 있습니다.SmarterSorter 프로그램에 대해 NullPointerException이 발생하는 이유는 무엇입니까?
이 프로그램은 SmarterSorter라고하며 다음과 같은 지침이 있습니다. (NullPointerException뿐 아니라 모든 프로그램에 대해 약간의 도움이 필요합니다.)
배경 : 알 수없는 수의 수직 신호음 (간격 없음)이 있습니다. 각 수직 파일에는 알 수없는 수의 신호음이 있습니다 (모서리 당 신호음 1 개 - 간격 없음). 맨 왼쪽 더미의 맨 아래 신호음은 항상 원래 위치에 있습니다.
의도적으로 글 머리 기호 형식의 알고리즘을 제공하지 않습니다 (따라서 글 머리 기호를 메서드로 변환 할 수는 없습니다). 나는 최종 사용자 (즉, 컴퓨터 프로그래밍면에서 준 지능 - 즉, 영어로 문제를 설명하려고합니다) 인 것처럼 생각합니다.
이SmarterSorterRobot (SSR)가 정렬을 수행합니다
그래서, 여기 알고리즘입니다. 그러나 PutterRobot (PUR) 및 PickerRobot (PIR)과 같은 도우미 (대표자)가 있습니다. SSR은 항상 동쪽을 향한 상태에서 시작하여 가장 왼쪽의 수직 파일에서 가장 아래쪽에있는 신호음에 서 있습니다. 그녀는 모든 수직 말뚝의 맨 아래 줄을 따라 걷고 빈 구석에 이르면 멈 춥니 다. 그런 다음 그녀는 모든 PIR을 생성 한 다음, 모두 생성 된 후에 차례대로 각각의 파일에서 모든 신호음을 들으라고 명령합니다 (예를 들어 첫 번째 수직 파일의 PIR이 위의 신호음이 5 번 그, 그는 그가 있었던 곳의 위의 6 개의 모퉁이에 서있을 것이다, 6 개의 비프 음을 집어 들었다). SSR은 이제 각각의 PIR을 검색 한 비퍼의 수를 쿼리해야하며 그녀는 그 수를 Bean의 int 배열로 가져올 때 그 수를 저장해야합니다. 그런 다음 해당 배열을 정렬해야합니다 (API for Arrays 참조). 그녀는 지금부터 왼쪽에서 오른쪽으로 작업하면서 곧 생성 될 첫 번째 곧 생성 될 신호기의 맨 아래에 PUR을 작성해야합니다. PUR는 얼마나 많은 신호음을 내야하는지 (가장 최근에 정렬 된 신호음 정렬). PUR는 모든 비퍼를 넣고 가능한 한 가장 효율적인 방법으로 홈 (아래 설명 참조)으로 가야합니다. SSR은 이제 두 번째 PUR을 생성하고 동일한 작업을 수행해야합니다. 즉, 모든 파일이 배치 될 때까지 (즉, 모든 더미가 내림차순으로 정렬되지 않고 모든 PUR이 HOME 위치에 배치 될 때까지) 계속됩니다. SSR은 이제 각 PIR에 홈으로 가도록 요청해야합니다. 그리고 마침내 SSR은 이제 집으로 돌아 가야합니다.
홈 : 홈은 가장 왼쪽 세로 열의 가장 위쪽 경고음의 바로 북쪽 모서리입니다. 나는 sortTheBeepers 방법의 첫 번째 줄에 NullPointerException이 얻을
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();
}
}
}
:
그리고 여기 내 코드입니다.
이유를 알 수 없습니다.
도움 주셔서 감사합니다.
회색 상자 외부의 브래킷은 그 안에 있어야합니다. – patriottothecrown
어떤 이유로 코드의 일부가 회색 상자 안에 들어 가지 않습니다! java.util.Arrays를 마지막 괄호로 가져 오기에서 모두 상자에 있어야합니다. – patriottothecrown
그래서 turnRight() 메소드와 그 기능을 보여줘야합니다. 그 메서드를 호출 할 때 nullpointer를 얻는다 고 말하면됩니다. 이 GoHomeBot을 올바르게 사용하고 있는지 확인해야합니다. – mattias