Android ArrayIndexOutOfBoundsException发生

Android ArrayIndexOutOfBoundsException发生,android,nfc,ndef,Android,Nfc,Ndef,在这里,我正在开发一个adroid应用程序,它将读取NFC标签中的记录。下面是我程序中读取标记的部分代码,当它读取时,会发生越界异常 NdefMessage[] msgs = null; String action = intent.getAction(); if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)|| NfcAdapter.ACTION_TAG_DISCOVERED.equals(action

在这里,我正在开发一个adroid应用程序,它将读取NFC标签中的记录。下面是我程序中读取标记的部分代码,当它读取时,会发生越界异常

NdefMessage[] msgs = null;
    String action = intent.getAction();
    if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)||
            NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)){
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if(rawMsgs != null){
            msgs = new NdefMessage[rawMsgs.length];
            for(int i=0; i<rawMsgs.length; i++){
                msgs[i] = (NdefMessage) rawMsgs[i];
            }
        }else{
            byte[] empty = new byte[]{};
            NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
            NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
            msgs = new NdefMessage[]{msg};
        }

    }
    if(msgs==null){
        String[] array = new String[]{"No Tag discovered!"};
        return array;
    }else{
        String[] array = new String[]{new String(msgs[0].getRecords()[0].getPayload()), 
                                        new String(msgs[1].getRecords()[0].getPayload())
        };
        return array;
    }
NdefMessage[]msgs=null;
String action=intent.getAction();
如果(NfcAdapter.ACTION\u NDEF\u DISCOVERED.equals)(ACTION)||
NfcAdapter.ACTION_TAG_DISCOVERED.equals(ACTION)){
Parcelable[]rawMsgs=intent.getParcelableArrayExtra(NfcAdapter.EXTRA\u NDEF\u消息);
if(rawMsgs!=null){
msgs=新的NdefMessage[rawMsgs.length];

对于(inti=0;iYes),这一行中的问题是肯定的

new String[]{new String(msgs[0].getRecords()[0].getPayload()), 
                                            new String(msgs[1].getRecords([0].getPayload())
因为您正在尝试访问
msgs[1]。getRecords
位于上一行。但如果您看到您的代码,在以下情况下:

else{
            byte[] empty = new byte[]{};
            NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
            NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
            msgs = new NdefMessage[]{msg};
        }

msgs数组仅包含一个元素,但您尝试访问第二个元素,该元素将不存在。因此,请在访问数组之前更改代码并应用条件。

我已尝试输出一些值,包括RAWMSG的长度和msgs[0]。getReord()是长度为1的,请问第二条记录在哪里?我终于尝试过了,我可以通过msgs[0].getRecord()[1].getPayload()访问第二条记录。我想再问一个问题,msgs数组是否有可能包含多个元素?因为我是通过以下示例编写此程序的,所以有一些代码我一点也不懂。您使用的是Parcelable[]rawMsgs=intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);如果rawMsgs的大小大于1,则msgs数组包含多个元素。但在您的情况下,rawMsgs数组包含Null,我以前尝试输出rawMsgs的长度,在我的情况下,它向meso显示1。如果正确,程序应以else方式而不是rawMsgs方式获取消息?