2015-11-25 176 views
0

您好StackOverflow用戶。這與Java而不是機器人本身有關。我試圖做的是將運動方法中的傳感器分開,以使代碼易於閱讀,但是我遇到了一個問題。Java Lejos拋出nullpointerException

Sensor.java

package sensors; 

import lejos.hardware.sensor.EV3ColorSensor; 
import lejos.hardware.sensor.EV3GyroSensor; 
import lejos.hardware.sensor.EV3TouchSensor; 
import lejos.hardware.sensor.EV3UltrasonicSensor; 

public class Sensors { 

    EV3TouchSensor touchSensor; 
    EV3ColorSensor colorSensor; 
    EV3GyroSensor gyroSensor; 
    EV3UltrasonicSensor ultrasonicSensor; 

    public Sensors(EV3TouchSensor t, EV3ColorSensor c, EV3GyroSensor g, EV3UltrasonicSensor u) { 
     touchSensor = t; 
     colorSensor = c; 
     gyroSensor = g; 
     ultrasonicSensor = u; 
    } 

    public int getColorSample(){ 
     int sample = colorSensor.getColorID(); 
     return sample; 
    } 

} 

Movement.java

public class Movement { 

    RegulatedMotor left; 
    RegulatedMotor right; 
    EV3TouchSensor touchSensor; 
    EV3ColorSensor colorSensor; 
    EV3GyroSensor gyroSensor; 
    EV3UltrasonicSensor ultrasonicSensor; 

    public Movement(RegulatedMotor l, RegulatedMotor r, EV3TouchSensor t, EV3ColorSensor c, EV3GyroSensor g, 
      EV3UltrasonicSensor u) { 
     left = l; 
     right = r; 
     touchSensor = t; 
     colorSensor = c; 
     gyroSensor = g; 
     ultrasonicSensor = u; 
    } 

    //initialize sensors 

    Sensors sensors = new Sensors(touchSensor, colorSensor, gyroSensor, ultrasonicSensor); 

    public void moveForward() { 
     // get the color sample of the ground 
     //int sample = colorSensor.getColorID(); 
     int sample = sensors.getColorSample(); 

     // while machine is on the ground color 
     while (sample != 7) { 

      // get new sample 
      //sample = colorSensor.getColorID(); 
      sample = sensors.getColorSample(); 

      // move forward 
      syncForward(); 
     } 
     // if on black, stop motors. 
     syncStop(); 
    } 

不要看其他的方法,因爲這些工作流利,但錯誤出現在第30行,它會嘗試從傳感器類中獲取樣本。 我不知道,我已經給出了註釋掉的行,以及流利的工作。 錯誤來自訪問傳感器類,我可以'想出一個解決方案。

我會在你的債務!

+1

您能否在您的代碼段中標記#30行? – AlexR

+2

你可以發佈你的stacktrace嗎? – stuXnet

+0

除了初始化之外,還有其他的傳感器分配嗎? – DBug

回答

2

啊,花了我一段時間來捕捉。

的問題是這一行: Sensors sensors = new Sensors(touchSensor, colorSensor, gyroSensor, ultrasonicSensor);

你寫的構造之後進行初始化,但儘管如此,你在構造函數初始化領域之前sensors將被分配。這樣,Sensors的對象將只創建空值,並且在調用sensors.getColorSample()時,Sensors類中的行int sample = colorSensor.getColorID();將引發NullPointerException。

爲了解決這個問題,嘗試改變Movement類,像這樣:

public class Movement { 

    RegulatedMotor left; 
    RegulatedMotor right; 
    EV3TouchSensor touchSensor; 
    EV3ColorSensor colorSensor; 
    EV3GyroSensor gyroSensor; 
    EV3UltrasonicSensor ultrasonicSensor; 

    // like in your code, sensors is still a field, but won't be initialized yet 
    Sensors sensors; 

    public Movement(RegulatedMotor l, RegulatedMotor r, EV3TouchSensor t, EV3ColorSensor c, EV3GyroSensor g, 
      EV3UltrasonicSensor u) { 
     left = l; 
     right = r; 
     touchSensor = t; 
     colorSensor = c; 
     gyroSensor = g; 
     ultrasonicSensor = u; 

     // here is the initialization of sensors - at this point, the arguments shouldn't be null anymore (unless they are passed as null to the constructor) 
     sensors = new Sensors(touchSensor, colorSensor, gyroSensor, ultrasonicSensor); 
    } 

    public void moveForward() { 
     // this method should be okay, you don't need to change it 

     // ... 
    } 

對未來的一些技巧:

  • 讓你的領域private - 看到Declaring Member Variables在Java教程
  • 如果某個字段不允許使用空值(例如,可能導致NullPointerException),請檢查您的參數是否爲空值,並在存在某些非法值時引發異常UE。
  • 試着學習調試你的代碼 - 你可能很快就看不到你的sensors中的字段全部爲空,那麼你可以再次調試,看看爲什麼是這樣。有關NullPointerExceptions的進一步閱讀,我推薦What is a Null Pointer Exception, and how do I fix it?
+0

謝謝@stuXnet。你真的再次拯救了我的一天。 告訴我是否可以從運動類的構造函數中刪除傳感器,並將所有內容都留給sensors.java來代替? 你是什麼意思的私人。在主要還是在運動和傳感器? –

+0

ad「private」:我在我的答案中添加了一個Java Tutorials的鏈接。你可以重構你的運動構造函數,只需要兩個運動參數和你的(之前初始化的)傳感器對象。 – stuXnet

0

的Class 運動,對象EV3ColorSensor在構造被定義....哪個類使用運動對象?

對傳感器構造器的空引用。

相關問題