Android: NullPointerException 'double java.lang.Double.doubleValue ()' - PullRequest
1 голос
/ 04 октября 2019

Я новичок в программировании Android и у меня проблемы с кодами. Может ли кто-нибудь мне помочь или указать причину моей ошибки, потому что я не совсем уверен, почему она дает мне NullPointerException, когда это текстовое представление или если это возможно.

LogCat:

    java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
    at com.example.app.rosbridge.MainActivity$2$1.run(MainActivity.java:133)

Вот код для этой строки:

   current.setText(String.format("%.4f%s", batteryStateData.msg.current * Math.pow(10, 6), "A"));

Но когда я запускаю свое приложение, мое напряжение становится равным нулю, а вот код напряжения:

   voltage.setText(String.format("%.4f%s", batteryStateData.msg.voltage, "v"));

Здесьэто полный код:

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 ]

3 голосов
/ 05 октября 2019

Проверьте погоду созданного вами класса с помощью GSON не равно нулю

, а затем проверьте, что значения полей класса не равны нулю или 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]));

}
1 голос
/ 04 октября 2019

Каждый раз, когда вы устанавливаете текст в textview, вы должны проверять, не является ли он нулевым.

1 голос
/ 04 октября 2019

Вы можете проверить нулевое значение, прежде чем устанавливать текст в режиме просмотра текста, как показано ниже.

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