2016-11-21 97 views
-2

我正在創建一個簡單的Android類,用一些特定的傳感器最新的值更新一個變量(Light,temp和更多),我通過getData()方法訪問它(傳感器值),但是出現錯誤。我希望你能幫助我!錯誤java.lang.NullPointerException:試圖調用虛擬方法'java.lang.Object android.content.Context.getSystemService

這是我的通用傳感器類。

MySensor

public class mySensor extends Service implements SensorEventListener { 

private SensorManager mSensorManager =null; 
private Sensor s=null; 

float data = 0; 


public void onCreate(){ 
    super.onCreate(); 
    mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE); 


} 


public mySensor(int type){ 

    //HERE I'M GETTING THE ERROR 
    s= mSensorManager.getDefaultSensor(type); 




} 

public String getData(){ 

    return String.valueOf(data); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_LIGHT) { 
     data = event.values[0]; 
    } 

} 

@Override 
public void onAccuracyChanged(Sensor sensor, int i) { 

} 
protected void onResume() { 

    mSensorManager.registerListener((SensorEventListener) this, s, SensorManager.SENSOR_DELAY_NORMAL); 


} 

protected void onPause() { 
    // super.onPause(); 
    mSensorManager.unregisterListener((SensorEventListener) this); 
} 
} 

這裏是日誌

... 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: project.luke.com.sensorreader, PID: 25297 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{project.luke.com.sensorreader/project.luke.com.sensorreader.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.Sensor android.hardware.SensorManager.getDefaultSensor(int)' on a null object reference 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522) 
         at android.app.ActivityThread.access$800(ActivityThread.java:169) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) 
         at android.os.Handler.dispatchMessage(Handler.java:111) 
         at android.os.Looper.loop(Looper.java:194) 
         at android.app.ActivityThread.main(ActivityThread.java:5546) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:967) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.Sensor android.hardware.SensorManager.getDefaultSensor(int)' on a null object reference 
         at project.luke.com.sensorreader.mySensor.<init>(mySensor.java:39) 
         at project.luke.com.sensorreader.MainActivity.onCreate(MainActivity.java:32) 
         at android.app.Activity.performCreate(Activity.java:5975) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522)  
         at android.app.ActivityThread.access$800(ActivityThread.java:169)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)  
         at android.os.Handler.dispatchMessage(Handler.java:111)  
         at android.os.Looper.loop(Looper.java:194)  
         at android.app.ActivityThread.main(ActivityThread.java:5546)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at java.lang.reflect.Method.invoke(Method.java:372)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:967)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)  

在我的MainActivity類別我簡單的調用mLight =新mySensor(Sensor.TYPE_LIGHT);但是這會觸發錯誤,導致mSensorManager = null,始終。

+2

可能重複[什麼是NullPointerException,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix -it) –

+0

請勿創建「Service」的隨機子類並通過某個構造函數使用它。最有可能的是,不需要使用「服務」 - 將此邏輯移入現有的「活動」中。即使你確實需要一個'Service',你也需要正確使用它(例如'startService()'),而不是自己創建一個實例。 – CommonsWare

+0

@Simze問題不在於「什麼是NPE?」但是「爲什麼我在初始化它之後得到* this * NPE? – Sam

回答

0

從您的MainActivity:

Intent intent = new Intent(this, mySensor.class); 
intent.putExtra("type", Sensor.TYPE_LIGHT); 

和您的服務中:

@Override 
public IBinder onBind(Intent intent) { 
    mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    int type = intent.getExtras().get("type"); 
    s= mSensorManager.getDefaultSensor(type); 
    return null; 
} 

,那麼你可以刪除:

public mySensor(int type){ 
    ... 
} 

,最終你onCreate內寫的代碼。

+0

@Londrake有意義嗎? – Lino

相關問題