1
votes

Android: NullPointerException 'double java.lang.Double.doubleValue ()'

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");

      }
          }
    });


4 commentaires

batteryStateData.msg.current est nul


Vé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);


3 Réponses :


0
votes

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]));
}


0 commentaires

1
votes

Chaque fois que vous définissez le texte sur textview, vous devez vérifier s'il n'est pas nul.


0 commentaires

0
votes

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 >


0 commentaires