java.lang.ArrayIndexOutOfBoundsException:length = 1;索引= 1

时间:2019-04-09 06:05:07

标签: java android arrays

我想分离从arduino传入的字符串,并将其存储在变量中以用于数据库目的,但是当我尝试在几分钟后使用split()对该字符串进行划分时,发生异常     java.lang.ArrayIndexOutOfBoundsException:length = 1; index = 1,应用程序不断停止 错误是在第203行分开的[1]

公共类MainActivity扩展了AppCompatActivity {

private static final String TAG = "Android-Arduino";

Button btnOn, btnOff;
TextView temperatureText, heartbeatText;
Handler h;

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

private ConnectedThread connectedThread;

// Common service that bluetooth device support
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

// MAC address of the bluetooth module.
private static String address = "00:18:E4:35:75:A6";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    temperatureText = (TextView) findViewById(R.id.temp);
    heartbeatText = (TextView)findViewById(R.id.heartbeat);

    getDataArduino();

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

    // Check whether the bluetooth is enabled / disabled
    checkBTState();


}

// Creates the communication chanel
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();
    // Set up a pointer to the remote node using it's address.
    BluetoothDevice device = btAdapter.getRemoteDevice(address);

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

    btAdapter.cancelDiscovery();
    try {
        btSocket.connect();
    } catch (IOException e) {
        try {
            btSocket.close();
        } catch (IOException ex) {
            errorExit("Fatal Error", "In onResume() and unable to close socket during " +
                    "connection failure" + ex.getMessage() + ".");
        }
    }

    // Creates the data stream with the server
    connectedThread = new ConnectedThread(btSocket);
    connectedThread.start();
}

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

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

private void checkBTState() {
    // Checks if the devices has bluetooth functionalities
    if(btAdapter==null) {
        errorExit("Fatal Error", "Bluetooth not support");
    } else {
        // Checks if the bluetooth is on
        if (btAdapter.isEnabled()) {
        } 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
                // Get number of bytes and message in "buffer"
                bytes = mmInStream.read(buffer);
                // Send to message queue Handler
                h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }

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

public void getDataArduino() {
    temperatureText.clearComposingText();
    h = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case RECIEVE_MESSAGE:
                    byte[] readBuf = (byte[]) msg.obj;
                    String strIncom = new String(readBuf, 0, msg.arg1);
                    sb.append(strIncom);
                    int endOfLineIndex = sb.indexOf("\n");
                    if (endOfLineIndex > 0) {
                        String sbprint = sb.substring(0, endOfLineIndex);
                        sb.delete(0, sb.length());
                        String[] separated = sbprint.split(":");
                        heartbeatText.setText(separated[0]+ "");
                        temperatureText.setText(separated[1]+ "");


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

我需要显示不同的温度,并且需要单独显示心率。

1 个答案:

答案 0 :(得分:0)

您可以首先尝试打印输入数据(StringBuffer sb)并拆分String数组(String []分隔)。由于字符串未按预期拆分,并且数组sbprint中仅存在1个元素,因此出现错误,这就是为什么尝试访问第二个元素时会得到ArrayIndexOutofBound索引的原因。

一旦您打印了分割字符串数组,它就会使您知道数据错误的地方。