我已阅读与此问题相关的问题,并且我得出的结论是,我的参考类型变量尚未初始化或其对象尚未创建用于解除引用。但是我不确定如何使用它的方式初始化String
类型的变量。以下是代码的一部分:
public class ManualControlsFragment extends Fragment {
private MqttAndroidClient client;
String payload1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_manual_controls, container, false);
switchLed = (Switch) view.findViewById(R.id.LEDManControl);
switchLed.setChecked(true);
switchLed.setTextOn("On");
switchLed.setTextOff("Off");
String clientId = MqttClient.generateClientId();
client =
new MqttAndroidClient(this.getActivity(), "tcp://192.168.100.6:1883",
clientId);
//Start of Manual Automation
try {
IMqttToken token = client.connect();
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
String topic = "rpi/gpio";
switchLed.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// If ischecked means if it is ON the it will show true else
// show false
if (isChecked) {
/*Toast.makeText(getActivity().getApplicationContext(),
"Switch is : " + isChecked, Toast.LENGTH_SHORT)
.show();*/
payload1 ="ledOn";
} else {
/*Toast.makeText(getActivity().getApplicationContext(),
"Switch is : " + isChecked, Toast.LENGTH_SHORT)
.show();*/
payload1 ="ledOff";
}
}
});
try {
/*if(payload1!=null){
MqttMessage message1 = new MqttMessage(payload1.getBytes());
client.publish(topic, message1);
}*/
MqttMessage message1 = new MqttMessage(payload1.getBytes());
client.publish(topic, message1);
这是logcat上出现的内容:
java.lang.NullPointerException: Attempt to invoke virtual method 'byte[] java.lang.String.getBytes()' on a null object reference
at com.example.teerna.smartagriculturev5.ManualControlsFragment$1.onSuccess(ManualControlsFragment.java:294)
at org.eclipse.paho.android.service.MqttTokenAndroid.notifyComplete(MqttTokenAndroid.java:124)
at org.eclipse.paho.android.service.MqttAndroidClient.simpleAction(MqttAndroidClient.java:1497)
at org.eclipse.paho.android.service.MqttAndroidClient.connectAction(MqttAndroidClient.java:1439)
at org.eclipse.paho.android.service.MqttAndroidClient.onReceive(MqttAndroidClient.java:1368)
at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:308)
at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:118)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5912)
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:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
此行显示错误:
MqttMessage message1 = new MqttMessage(payload1.getBytes());
我尝试了以下但是它们不起作用:
if (isChecked) {
payload1 = new String("ledOn");
} else {
payload1 = new String("ledOff");
}
我试图查看有效负载是否为空。这阻止了应用程序崩溃(并显示NullPointException)并且它没有发送有效负载:
try {
if(payload1!=null){
MqttMessage message1 = new MqttMessage(payload1.getBytes());
client.publish(topic, message1);
}
我认为错误的原因在于payload
没有被初始化,这使得它为空。我想知道我应该在哪里初始化它或者我应该如何使用它,因为将变量放在try
块中会给我错误,因此它应该被声明为final,当我将其声明为final
时我是无法为其分配值,因为在我创建final
之后无法更改它。
非常感谢任何帮助。
感谢所有答案。
我实际上重新考虑了用于发送有效负载的方法,并且我意识到服务器没有获得有效负载的原因是因为正在发送空的有效负载并且它没有根据交换机中的更改发送有效负载。交换机的目的是将有效负载发送到服务器,告诉我的微控制器根据交换机的状态打开或关闭LED。我重新编写了它,因为我在下面发布了它并且工作得非常好:
switchLed.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// If ischecked means if it is ON the it will show true else
// show false
if (isChecked) {
String payload1="ledOn";
MqttMessage message1 = new MqttMessage(payload1.getBytes());
try {
client.publish(topic, message1);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
String payload2 = "ledOff";
MqttMessage message2 = new MqttMessage(payload2.getBytes());
try {
client.publish(topic, message2);
} catch (MqttException e) {
e.printStackTrace();
}
}
}
});
答案 0 :(得分:1)
在您onCreateView
声明变量String payload1;
之前,它尚未初始化。
这仅在您更改开关时有效,如果从未更改过,您的变量将永远不会被初始化。
if (isChecked) {
payload1 = new String("ledOn");
} else {
payload1 = new String("ledOff");
}
我建议你做的是用这两种状态之一或用空字符串初始化它。这样它永远不会为空:
String payload1 = "ledOn";
答案 1 :(得分:0)
您只需声明变量 String payload1; 如果要使用 payload1.getBytes() ,则只需初始化String变量。 在你的情况下,我不是为什么,但是 switchLed.setOnCheckedChangeListener 不是调用,因此未初始化变量。 这就是您在代码中出错的原因