java.lang.NumberFormatException:无效整数:“”

java.lang.NumberFormatException: Invalid int: “”

Android 应用程序:

 private static final String TAG = "HC-05";   
  Button btnReceive;
  TextView txtReading;
  Handler h;
  ImageView imv1, imv2, imv3, imv4;
  int s1=0, s2=0;

  final int RECIEVE_MESSAGE = 1;        // Status  for Handler
  private BluetoothAdapter btAdapter = null;
  private BluetoothSocket btSocket = null;
  private StringBuilder sb = new StringBuilder();

  private ConnectedThread mConnectedThread;

  // SPP UUID service
  private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  // MAC-address of Bluetooth module (you must edit this line)
  private static String address = "98:D3:31:80:57:0D";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 



    imv1 =(ImageView) findViewById(R.id.imageView1);
    imv2 =(ImageView) findViewById(R.id.imageView2);
    imv3 =(ImageView) findViewById(R.id.imageView3);
    imv4 =(ImageView) findViewById(R.id.imageView4);
        btnReceive = (Button) findViewById(R.id.btnReceive);                // button LED OFF
        txtReading = (TextView) findViewById(R.id.txtReading);

         h = new Handler() {
                public void handleMessage(android.os.Message msg) {
                    switch (msg.what) {
                    case RECIEVE_MESSAGE:                                                   // if receive massage
                        byte[] readBuf = (byte[]) msg.obj;
                        String strIncom = new String(readBuf, 0, msg.arg1);                 // create string from bytes array
                        sb.append(strIncom);                                                // append string
                        int endOfLineIndex = sb.indexOf("\r\n");                            // determine the end-of-line
                        if (endOfLineIndex > 0) {                                            // if end-of-line,
                            String sbprint = sb.substring(0, endOfLineIndex);               // extract string
                            sb.delete(0, sb.length());                                      // and clear
                            txtReading.setText("Data from Arduino: " + sbprint);
                            //System.out.println(sbprint);
                            **if(sbprint!=null || !"0".equals(sbprint)){
                                 s2 = Integer.parseInt(sbprint);
                                 initOpacity();
                            }**

                            // update TextView
                            btnReceive.setEnabled(true);

                           // if(!"".equals(sbprint)){

                         //   }
                          //  else
                         //   {
                          //    s2=0;
                          //  }

                             System.out.println("================== VAlUE BT = " +s2+ "===================");

                        }


                        //Log.d(TAG, "...String:"+ sb.toString() +  "Byte:" + msg.arg1 + "...");
                        break;
                    }
                };
            };


            btAdapter = BluetoothAdapter.getDefaultAdapter();       // get Bluetooth adapter
            checkBTState();

        /*    btnReceive.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  btnReceive.setEnabled(false);
                  mConnectedThread.write("1");    // Send "1" via Bluetooth
                //Toast.makeText(getBaseContext(), "Turn on LED", Toast.LENGTH_SHORT).show();
              }
            });*/




    }


     private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
          if(Build.VERSION.SDK_INT >= 10){
              try {
                  final Method  m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
                  return (BluetoothSocket) m.invoke(device, MY_UUID);
              } catch (Exception e) {
                  Log.e(TAG, "Could not create Insecure RFComm Connection",e);
              }
          }
          return  device.createRfcommSocketToServiceRecord(MY_UUID);
      }

      @Override
      public void onResume() {
        super.onResume();

        Log.d(TAG, "...onResume - try connect...");

        // Set up a pointer to the remote node using it's address.
        BluetoothDevice device = btAdapter.getRemoteDevice(address);

        // Two things are needed to make a connection:
        //   A MAC address, which we got above.
        //   A Service ID or UUID.  In this case we are using the
        //     UUID for SPP.

        try {
            btSocket = createBluetoothSocket(device);
        } catch (IOException e) {
            errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
        }

        // Discovery is resource intensive.  Make sure it isn't going on
        // when you attempt to connect and pass your message.
        btAdapter.cancelDiscovery();

        // Establish the connection.  This will block until it connects.
        Log.d(TAG, "...Connecting...");
        try {
          btSocket.connect();
          Log.d(TAG, "....Connection ok...");
        } catch (IOException e) {
          try {
            btSocket.close();
          } catch (IOException e2) {
            errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
          }
        }

        // Create a data stream so we can talk to server.
        Log.d(TAG, "...Create Socket...");

        mConnectedThread = new ConnectedThread(btSocket);
        mConnectedThread.start();
      }

      @Override
      public void onPause() {
        super.onPause();

        Log.d(TAG, "...In onPause()...");

        try     {
          btSocket.close();
        } catch (IOException e2) {
          errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
        }
      }

      private void checkBTState() {
        // Check for Bluetooth support and then check to make sure it is turned on
        // Emulator doesn't support Bluetooth and will return null
        if(btAdapter==null) {
          errorExit("Fatal Error", "Bluetooth not support");
        } else {
          if (btAdapter.isEnabled()) {
            Log.d(TAG, "...Bluetooth ON...");
          } else {
            //Prompt user to turn on Bluetooth
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, 1);
          }
        }
      }

      private void errorExit(String title, String message){
        Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
        finish();
      }

      private class ConnectedThread extends Thread {
            private final InputStream mmInStream;
            private final OutputStream mmOutStream;

            public ConnectedThread(BluetoothSocket socket) {
                InputStream tmpIn = null;
                OutputStream tmpOut = null;

                // Get the input and output streams, using temp objects because
                // member streams are final
                try {
                    tmpIn = socket.getInputStream();
                    tmpOut = socket.getOutputStream();
                } catch (IOException e) { }

                mmInStream = tmpIn;
                mmOutStream = tmpOut;
            }

            public void run() {
                byte[] buffer = new byte[256];  // buffer store for the stream
                int bytes; // bytes returned from read()

                // Keep listening to the InputStream until an exception occurs
                while (true) {
                    try {
                        // Read from the InputStream
                        bytes = mmInStream.read(buffer);        // Get number of bytes and message in "buffer"
                        h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
                    } catch (IOException e) {
                        break;
                    }
                }
            }

            /* Call this from the main activity to send data to the remote device */
            public void write(String message) {
                Log.d(TAG, "...Data to send: " + message + "...");
                byte[] msgBuffer = message.getBytes();
                try {
                    mmOutStream.write(msgBuffer);
                } catch (IOException e) {
                    Log.d(TAG, "...Error data send: " + e.getMessage() + "...");
                  }
            }
        }

      public void initOpacity()
        {


          if( s2 < 100)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha1);
            imv1.startAnimation(an);
        }
        else if(s2 > 100 && s2 < 200)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha2);
            imv1.startAnimation(an);
        }
        else if(s2 > 200 && s2 < 300)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha3);
            imv1.startAnimation(an);
        }
        else if(s2 > 300 && s2 < 400)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha4);
            imv1.startAnimation(an);
        }
        else if(s2 > 400 && s2 < 500)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha5);
            imv1.startAnimation(an);
        }
        else if(s2 > 500 && s2 < 600)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha6);
            imv1.startAnimation(an);
        }
        else if(s2 > 600 && s2 < 700)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha7);
            imv1.startAnimation(an);
        }
        else if(s2 > 700 && s2 < 800)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha8);
            imv1.startAnimation(an);
        }
        else if(s2 > 800 && s2 < 900)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha9);
            imv1.startAnimation(an);
        }
        else if(s2 > 900)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha10);
            imv1.startAnimation(an);            
        }


        //i2

        if( s2 < 100)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha1);
            imv2.startAnimation(an);
        }
        else if(s2 > 100 && s2 < 200)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha2);
            imv2.startAnimation(an);
        }
        else if(s2 > 200 && s2 < 300)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha3);
            imv2.startAnimation(an);
        }
        else if(s2 > 300 && s2 < 400)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha4);
            imv2.startAnimation(an);
        }
        else if(s2 > 400 && s2 < 500)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha5);
            imv2.startAnimation(an);
        }
        else if(s2 > 500 && s2 < 600)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha6);
            imv2.startAnimation(an);
        }
        else if(s2 > 600 && s2 < 700)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha7);
            imv2.startAnimation(an);
        }
        else if(s2 > 700 && s2 < 800)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha8);
            imv2.startAnimation(an);
        }
        else if(s2 > 800 && s2 < 900)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha9);
            imv2.startAnimation(an);
        }
        else if(s2 > 900)
        {
            Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha10);
            imv2.startAnimation(an);            
        }



        //Right Foot Blank
        Animation an1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha0);
        imv3.startAnimation(an1);
        Animation an2 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha0);
        imv4.startAnimation(an2);    
        }



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}}

Arduino 蓝牙:

#include <SoftwareSerial.h>// import the serial library
SoftwareSerial Genotronex(10, 11); // RX, TX

int BluetoothData; // the data given from Computer
int sensorPin = A0;
int sensorValue = 0;
int ledPin = 13;  


void setup() {
Genotronex.begin(9600);
pinMode(ledPin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
sensorValue = analogRead(sensorPin);



Genotronex.println(sensorValue);

delay(500);

}

logcat:

01-29 17:17:11.637: I/System.out(1776): ================== VAlUE BT = 0===================
01-29 17:17:11.797: I/System.out(1776): ================== VAlUE BT = 777===================
01-29 17:17:12.327: I/System.out(1776): ================== VAlUE BT = 975===================
01-29 17:17:12.807: I/System.out(1776): ================== VAlUE BT = 669===================
01-29 17:17:13.327: I/System.out(1776): ================== VAlUE BT = 971===================
01-29 17:17:13.817: I/System.out(1776): ================== VAlUE BT = 224===================
01-29 17:17:14.327: D/AndroidRuntime(1776): Shutting down VM
01-29 17:17:14.327: E/AndroidRuntime(1776): FATAL EXCEPTION: main
01-29 17:17:14.327: E/AndroidRuntime(1776): Process: com.example.blutooth, PID: 1776
01-29 17:17:14.327: E/AndroidRuntime(1776): java.lang.NumberFormatException: Invalid int: "
"
01-29 17:17:14.327: E/AndroidRuntime(1776):     at java.lang.Integer.invalidInt(Integer.java:138)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at java.lang.Integer.parse(Integer.java:410)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at java.lang.Integer.parseInt(Integer.java:367)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at java.lang.Integer.parseInt(Integer.java:334)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at com.example.blutooth.MainActivity.handleMessage(MainActivity.java:88)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at android.os.Looper.loop(Looper.java:145)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at android.app.ActivityThread.main(ActivityThread.java:5944)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at java.lang.reflect.Method.invoke(Native Method)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at java.lang.reflect.Method.invoke(Method.java:372)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
01-29 17:17:14.327: E/AndroidRuntime(1776):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

当传感器的值低于 10 时,我的应用程序崩溃了。 我试图过滤 's2' 以填充来自 arduino 的数据,仅当存在整数值时。但不知何故它仍然因同样的错误而崩溃。 我在这里遗漏了什么吗?

java.lang.NumberFormatException 发生所以你检查你的字符串是否为空或 null 然后转换成 int

         if(sbprint!=null || !"0".equals(sbprint)){
                             s2 = Integer.parseInt(sbprint);
                             initOpacity();
                        }

变为

                    if((sbprint!= null) && (!sbprint.isEmpty())){
                     isNumeric(String sbprint) 
                            {
                             s2 = Integer.parseInt(sbprint);
                             initOpacity();
                            }
                            else
                               {
                             //your string not in numeric format
                                }
                        }

并使用以下代码检查您的字符串是否为数字格式。source

public static boolean isNumeric(String str)  
{  
try  
{  
double d = Double.parseDouble(str);  
}  
catch(NumberFormatException nfe)  
{  
return false;  
 }  
 return true;  
}

如果我没弄错的话...检查字符串 \n ..

if(sbprint!=null && !("0".equals(sbprint)) && !(sbprint.contains("\n"))){
               s2 = Integer.parseInt(sbprint);
               initOpacity();
             }

好的,现在不会崩溃了。

原来问题出在这一行:String sbprint = sb.substring(0, endOfLineIndex);

我在行末添加了 trim() 现在没有问题了。

 String sbprint = sb.substring(0, endOfLineIndex).trim(); 

我也使用了来自@sasikumar 的这个 if 语句:

if(sbprint!=null && (!sbprint.isEmpty())                                                                                                                                                                                                                                                                                                                                                                                                                                                       && !(sbprint.contains("\n"))){
     s2 = Integer.parseInt(sbprint);
     initOpacity();
}

感谢您的帮助!