Je suis nouveau dans la programmation Android et j'ai un problème avec mes codes. Quelqu'un peut-il m'aider ou indiquer la cause de mon erreur parce que je ne sais pas vraiment pourquoi il me donne une NullPointerException quand c'est une vue de texte ou si cela est possible.
LogCat:
public class MainActivity extends Activity { private TextView voltage, current, percentage, status; private SubscribedData<BatteryState> batteryStateData; private RosbridgeListener rosbridge; private boolean subscribed = false; private boolean advertised = false; /** Indicates that Lint should ignore the specified warnings for the annotated element. */ @SuppressLint("ClickableViewAccessibility") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_activity); Button settings_btn = (Button) findViewById(R.id.connect_btn); voltage = findViewById(R.id.voltage_txt); current = findViewById(R.id.current_txt); percentage = findViewById(R.id.percentage_txt); status = findViewById(R.id.status_txt); connectButton = findViewById(R.id.connect_btn); batteryStateData = new SubscribedData<>(); final Type batteryStateType = new TypeToken<SubscribedData<BatteryState>>() { }.getType(); // ROSBRIDGE protocol allows access to underlying ROS messages and services as serialized JavaScript Object Notation (JSON) objects WebSocket protocol communicates to a server for the connection from a user's web browser //A connection to the rosbridge thru the IP address of the robot from the socket rosbridge = new RosbridgeListener("ws://10.24.204.231:9090"); rosbridge.setOnDataReceivedListener(new RosbridgeMessageListener() { // a running thread that when the connection is made the data of the topic will serialize and deserialized java objects to (and from) JSON. @param msg @Override public void onDataReceived(final String msg) { try { runOnUiThread(new Runnable() { @Override public void run() { batteryStateData = new Gson().fromJson(msg, batteryStateType); voltage.setText(String.format("%.4f%s", batteryStateData.msg.voltage, "v")); current.setText(String.format("%.4f%s", batteryStateData.msg.current * Math.pow(10, 6), "A")); percentage.setText(String.format("%.2f%s", batteryStateData.msg.percentage, "%")); status.setText(String.format("%s", PowerSupplyStatus.values()[batteryStateData.msg.powerSupplyStatus])); } }); Log.d("B9T", String.format("Received data: %s", msg)); } catch (Exception e) { e.printStackTrace(); } } }); connectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!subscribed) { rosbridge.Subscribe("/battery", "sensor_msgs/BatteryState"); subscribed = true; connectButton.setText("Disconnect"); } else { rosbridge.UnSubscribe("/battery"); subscribed = false; connectButton.setText("Connect"); } } });
3 Réponses :
Vous pouvez vérifier null avant de définir le texte sur la vue textuelle comme suit.
@Override public void run() { batteryStateData = new Gson().fromJson(msg, batteryStateType); // check null before set text or calculate something if(batteryStateData.msg.current != null){ current.setText(String.format("%.4f%s", batteryStateData.msg.current * Math.pow(10, 6), "A")); } // you can check belows like above voltage.setText(String.format("%.4f%s", batteryStateData.msg.voltage, "v")); percentage.setText(String.format("%.2f%s", batteryStateData.msg.percentage, "%")); status.setText(String.format("%s", PowerSupplyStatus.values()[batteryStateData.msg.powerSupplyStatus])); }
Chaque fois que vous définissez le texte sur textview, vous devez vérifier s'il n'est pas nul.
Vérifiez si votre classe créée avec GSON n'est pas nulle
, puis vérifiez que les valeurs des champs de classe ne sont pas nulles ou 0.
batteryStateData = new Gson().fromJson(msg, batteryStateType); if (batteryStateData != null) { if (batteryStateData.msg.voltage!=0) voltage.setText(String.format("%.4f%s", batteryStateData.msg.voltage, "v")); if (batteryStateData.msg.current!=0) current.setText(String.format("%.4f%s", batteryStateData.msg.current * Math.pow(10, 6), "A")); if (batteryStateData.msg.percentage!=0) percentage.setText(String.format("%.2f%s", batteryStateData.msg.percentage, "%")); if (batteryStateData.msg.values !=null) status.setText(String.format("%s", PowerSupplyStatus.values()[batteryStateData.msg.powerSupplyStatus])); }
p >
batteryStateData.msg.current
est nulVérifiez si batteryStateData.msg.current est nul.
@SanilKhurana désolé comme je l'ai mentionné que je suis nouveau. comment je fais ça?
@RexJohnMabunga Un moyen très simple et simple de le faire serait simplement d'imprimer la valeur de batteryStateData.msg.current dans logcat. Vous pouvez le faire par Log.d ('MyActivity', batteryStateData.msg.current);