2015-09-06 58 views
0

我想打電話給調用不同類在java中的主類的函數

public synchronized void refreshGPIOPinState() 

在包com.rpi.rpi_gpio_controller; (這是主要的)

from package com.rpi.GPIOController; 與

mApplication.refreshGPIOPinState(); 

得到一個錯誤顯示java.lang.NullPointerException約行

package com.rpi.GPIOController; 

import com.pi4j.io.gpio.GpioController; 
import com.pi4j.io.gpio.GpioFactory; 
import com.pi4j.io.gpio.GpioPinDigitalOutput; 
import com.pi4j.io.gpio.PinState; 
import com.pi4j.io.gpio.RaspiPin; 
import com.pi4j.wiringpi.GpioInterrupt; 
import com.pi4j.wiringpi.GpioInterruptEvent; 
import com.pi4j.wiringpi.GpioInterruptListener; 
import com.pi4j.wiringpi.Gpio; 
import com.pi4j.wiringpi.GpioUtil; 
import com.rpi.Utils.Utils; 
import com.rpi.rpi_gpio_controller.Rpi_gpio_controllerApplicationUI; 

    public enum GPIOController { 

INSTANCE(true); 
final GpioController gpioController = GpioFactory.getInstance(); 
private Rpi_gpio_controllerApplicationUI mApplication ; 
// The used GPIO pins 
public GpioPinDigitalOutput[] mGPIOPins = new GpioPinDigitalOutput[1]; 

// *************************************** 
// Constuctor 
private GPIOController(boolean setLowOnExit) { 

    mGPIOPins[0] = gpioController.provisionDigitalOutputPin(RaspiPin.GPIO_00, "GPIO_Pin_" + 0, PinState.LOW); 
    if (setLowOnExit) { 
     // Set shutdown behavior for all pins 
     mGPIOPins[0].setShutdownOptions(true, PinState.LOW); 
    } 
} 
// *************************************** 

// *************************************** 
public void GetInput(int trigerpin, int outputpin) throws InterruptedException { 
    Utils.Output_WriteDebug(true, " GPIO Trigger ... started on " + trigerpin + " OutPutPin " + outputpin); 
    GpioInterrupt.addListener(new GpioInterruptListener() { 
     @Override 
     public void pinStateChange(GpioInterruptEvent event) { 
      Utils.Output_WriteDebug(true, "Raspberry Pi PIN [" + trigerpin + "] is in STATE [" + event.getState() + "]"); 
      try { 
       mGPIOPins[outputpin].toggle(); 
       mApplication.refreshGPIOPinState(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    // setup wiring pi 
    if (Gpio.wiringPiSetup() == -1) { 
     Utils.Output_WriteDebug(true, " ==>> GPIO SETUP FAILED"); 
    } 

    // export all the GPIO pins that we will be using 
    GpioUtil.export(trigerpin, GpioUtil.DIRECTION_IN); 

    // set the edge state on the pins we will be listening for 
    GpioUtil.setEdgeDetection(trigerpin, GpioUtil.EDGE_BOTH); 

    // configure GPIO x as an INPUT pin; enable it for callbacks 
    Gpio.pinMode(trigerpin, Gpio.INPUT); 
    Gpio.pullUpDnControl(trigerpin, Gpio.PUD_DOWN); 
    GpioInterrupt.enablePinStateChangeCallback(trigerpin); 
} 
// *************************************** 

} 

當中斷髮生調用refreshGPIOPinState改變圖像的狀態。

+0

可以包括完整的堆棧跟蹤嗎? – Mureinik

+0

確實沒有太多上下文,但代碼執行時看起來像mApplication爲空。 – ash

+0

mApplication爲空。檢查對象是爲該類創建的。 –

回答

1

您已聲明的字段:

private Rpi_gpio_controllerApplicationUI mApplication; 

可是你有沒有分配任何東西給它。所以參考mApplication不指向任何對象,因此NullPointerException。

您需要創建/獲取Rpi_gpio_controllerApplicationUI的實例並將其分配給mApplication(例如,在構造函數中)。