2014-11-15 3 views
-1

나는 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(); 
     } 
    } 
    } 

:

그리고 여기 내 코드입니다.

이유를 알 수 없습니다.

도움 주셔서 감사합니다.

+0

회색 상자 외부의 브래킷은 그 안에 있어야합니다. – patriottothecrown

+0

어떤 이유로 코드의 일부가 회색 상자 안에 들어 가지 않습니다! java.util.Arrays를 마지막 괄호로 가져 오기에서 모두 상자에 있어야합니다. – patriottothecrown

+0

그래서 turnRight() 메소드와 그 기능을 보여줘야합니다. 그 메서드를 호출 할 때 nullpointer를 얻는다 고 말하면됩니다. 이 GoHomeBot을 올바르게 사용하고 있는지 확인해야합니다. – mattias

답변

0

우리는 다음과 같은 방법을 살펴 보자 :

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

그것은 지역 numBeepers 배열과 함께 일을하는 방법 transferToBeepers() 호출 한 다음 다른 (이 시간 글로벌) 변수 numBeeperssortTheBeepers를 호출하고 . 이 numBeepers 버전은 이전에 초기화되지 않았기 때문에 여전히 null이므로 for (int i=0; i<numBeepers.length; i++) 행은 numBeepers.length (즉 null.length) 호출로 인해 NullPointerException을 던졌습니다.

어떻게 해결할 수 있습니까? transferToBeepers 메서드를 다시보십시오. 보시다시피, 언급 된 로컬 버전 numBeepers을 반환하지만 현재 반환 된 값은 무시하고 있습니다.

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

그런 식으로, 당신은 transferToBeepers의 결과 글로벌 numBeepers 버전을 초기화하고 그리고 그것은 sortTheBeepers(numBeepers) 통화 중 null되지 않습니다 : 그래서 다음과 같이 위의 라인을 변경합니다.

Btw 또한 transferToBeepers 방법으로 numBeepers [i] = ; 행을 수정해야합니다.

+0

정말 고마워요! – patriottothecrown

관련 문제