Come risolvere java.lang.ArrayIndexOutOfBoundsException: lunghezza = 1; index = 1

Sto creando un'applicazione android che consiste di una comunicazione seriale. Sto ottenendo un errore chiamato java.lang.ArrayIndexOutOfBoundsException: lunghezza = 1; index = 1 per favore dimmi come risolvere il problema

Questo è il mio driver usb:

  • Perché ArrayIndexOutOfBoundsException si verifica e come evitarlo in Android?
  • java.lang.ArrayIndexOutOfBoundsException: lunghezza = 6; index = 6 | String.xml
  • public class UsbDriver { private final Context mApplicationContext; private final UsbManager mUsbManager; @SuppressWarnings("unused") private final UsbConnectionHandler mConnectionHandler; private final int VID; private final int PID; protected static final String ACTION_USB_PERMISSION = "ch.serverbox.android.USB"; public static int Device_Exception; public static UsbDevice Device_Details; public static UsbEndpoint Data_In_End_Point = null; public static UsbEndpoint Data_Out_End_Point = null; public static UsbDeviceConnection USB_Device_Connection; public UsbDriver(Activity parentActivity,UsbConnectionHandler connectionHandler, int vid, int pid) { mApplicationContext = parentActivity.getApplicationContext(); mConnectionHandler = connectionHandler; mUsbManager = (UsbManager) mApplicationContext.getSystemService(Context.USB_SERVICE); VID = 1027; PID = 24577; Device_Exception = 0; // init(); Check_Devices(); } private void Check_Devices() { @SuppressWarnings("unused") int j=0; HashMap<String, UsbDevice> devlist = mUsbManager.getDeviceList(); Iterator<UsbDevice> deviter = devlist.values().iterator(); Device_Details = null; if (devlist.size() != 0) { while (deviter.hasNext()) { Device_Details = deviter.next(); if (Device_Details.getVendorId() == VID && Device_Details.getProductId() == PID){ if (!mUsbManager.hasPermission(Device_Details)){ onPermissionDenied(Device_Details); } else { UsbDeviceConnection conn = mUsbManager.openDevice(Device_Details); if (!conn.claimInterface(Device_Details.getInterface(1), true)){ return; } conn.controlTransfer(0x21, 34, 0, 0, null, 0, 0); conn.controlTransfer(0x21, 32, 0, 0,new byte[] { (byte) 0x80, 0x25 , 0x00, 0x00,0x00, 0x00, 0x08 }, 7, 0); USB_Device_Connection=conn; Data_In_End_Point = null; Data_Out_End_Point = null; UsbInterface usbIf = Device_Details.getInterface(1); for (int i = 0; i < usbIf.getEndpointCount(); i++) { if (usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { if (usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) Data_In_End_Point = usbIf.getEndpoint(i); else Data_Out_End_Point = usbIf.getEndpoint(i); } } if (Data_In_End_Point == null || Data_Out_End_Point == null) Device_Exception = 2; } break; }j++; } if (Device_Details == null) { Device_Exception = 3; return; } } else { Device_Exception = 1; return; } } public void onPermissionDenied(UsbDevice d) { UsbManager usbman = (UsbManager) mApplicationContext.getSystemService(Context.USB_SERVICE); PendingIntent pi = PendingIntent.getBroadcast(mApplicationContext, 0, new Intent(ACTION_USB_PERMISSION), 0); mApplicationContext.registerReceiver(mPermissionReceiver,new IntentFilter(ACTION_USB_PERMISSION)); usbman.requestPermission(d, pi); } private class PermissionReceiver extends BroadcastReceiver { private final IPermissionListener mPermissionListener; public PermissionReceiver(IPermissionListener permissionListener){ mPermissionListener = permissionListener; } @Override public void onReceive(Context context, Intent intent) { mApplicationContext.unregisterReceiver(this); if (intent.getAction().equals(ACTION_USB_PERMISSION)) { if (!intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { mPermissionListener.onPermissionDenied((UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)); } else { l("Permission granted"); UsbDevice dev = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (dev != null){ if (dev.getVendorId() == VID && dev.getProductId() == PID) { Check_Devices() ; } }else{ e("device not present!"); } } } } } private BroadcastReceiver mPermissionReceiver = new PermissionReceiver(new IPermissionListener() { @Override public void onPermissionDenied(UsbDevice d) { l("Permission denied on " + d.getDeviceId()); } }); private static interface IPermissionListener { void onPermissionDenied(UsbDevice d); } public final static String TAG = "USBController"; private void l(Object msg) { Log.d(TAG, ">==<" + msg.toString() + " >==<"); } private void e(Object msg) { Log.e(TAG, ">==< " + msg.toString() + " >==<"); } } 

    Questo è il mio gestore di connessione usb

     public interface UsbConnectionHandler { void onUsbStopped(); void onErrorLooperRunningAlready(); void onDeviceNotFound(); } 

    Questa è la mia attività principale:

     public class MainActivity extends Activity { EditText communication_data; Button send; public static final int targetVendorID = 1027; public static final int targetProductID = 24577; public UsbManager manager; public UsbDeviceConnection usbDeviceConnection; public UsbInterface usbInterfaceFound = null; public UsbEndpoint endpointOut = null; public UsbEndpoint endpointIn = null; public UsbDevice usbdevice,device_details; public UsbEndpoint listusbendpoint; private static final int VID = 1027; private static final int PID = 24577; @SuppressWarnings("unused") private static UsbDriver Usb_Driver_class; ActionBar actionbar; UsbConnectionHandler connectionHandler; public static UsbDriver USB_Driver_Child; public static boolean Communication_Failed,Frame_Ok,Total_Frame_Decoded; static byte[] Communication_Byte; HashMap<String, UsbDevice> devicelist= null; static byte[] sample; static boolean Communication_Ok; static int Sequence_No,Response_Time; Thread Receive; ByteBuffer buffer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //communication_data = (EditText)findViewById(R.id.editText_comm); send = (Button)findViewById(R.id.button1_sendin); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Communication_Byte=new byte[1]; if(Check_Devices_Available()==true) { int Packet_Size = USB_Driver_Child.Data_In_End_Point.getMaxPacketSize(); Toast.makeText(MainActivity.this,""+Packet_Size, Toast.LENGTH_LONG).show(); Receive.start(); Communication_Ok=false; for(int i=0;(i<5 && Communication_Ok!=true);i++) Send_Communication_Check_Command(); if(Communication_Ok) Toast.makeText(MainActivity.this, "Communication Successfully Established", 1000).show(); else Toast.makeText(MainActivity.this, "Communication Failure", 10000).show(); } } private boolean Check_Devices_Available() { Usb_Driver_class = new UsbDriver(MainActivity.this, connectionHandler, VID, PID); if(USB_Driver_Child.Device_Exception==0){ if(USB_Driver_Child.USB_Device_Connection==null || USB_Driver_Child.Data_Out_End_Point==null) return false; Toast.makeText(MainActivity.this,"Device Found", 1000).show(); return true; }else if(USB_Driver_Child.Device_Exception==1){ Toast.makeText(MainActivity.this,"No Devices Attached ", Toast.LENGTH_LONG).show(); return false; }else if(USB_Driver_Child.Device_Exception==2){ Toast.makeText(MainActivity.this,"Device Found,But No End Points", Toast.LENGTH_LONG).show(); return false; }else if(USB_Driver_Child.Device_Exception==3){ Toast.makeText(MainActivity.this,"Unable to Open Device", Toast.LENGTH_LONG).show(); return false; } return false; } Thread Receive = new Thread(new Runnable(){ @SuppressWarnings("unused") @Override public void run() { Sequence_No=0; buffer = ByteBuffer.allocate(64); sample = new byte[64]; int Frame_Size; UsbRequest request = new UsbRequest(); int i,j; byte [] datarx=new byte[1]; char q; while (true) { request.initialize(UsbDriver.USB_Device_Connection, UsbDriver.Data_In_End_Point); request.queue(buffer, 64); if (UsbDriver.USB_Device_Connection.requestWait() == request) { sample=buffer.arrays(); for(i=0;i<64;i++){ if(sample[i]=='&'){ Communication_Ok=true; break; }else if(sample[i]==0x03){ if(sample[0]==0x02) //Frame_Ok=true; break; } } if(Frame_Ok==true){ //Frame_Ok=false; //if(sample[1]==1) //Coil_No=1; //else //Coil_No=2; //Response_Time= (int)(((sample[2]&0x00FF)<<8) + (sample[3]&0x00FF)); //Total_Frame_Decoded=true; //sample = null; } } } } }); private void Send_Communication_Check_Command() { long i,j; Communication_Byte[0]='&'; UsbDriver.USB_Device_Connection.bulkTransfer(UsbDriver.Data_Out_End_Point,Communication_Byte, 1, 0); for(i=0;(i<1000 && Communication_Ok!=true) ;i++) for(j=0;(j<1000 && Communication_Ok!=true);j++); } }); } } 

    Questo è il mio logcat:

     E/AndroidRuntime(2452): FATAL EXCEPTION: main E/AndroidRuntime(2452): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 E/AndroidRuntime(2452): at android.hardware.usb.UsbDevice.getInterface(UsbDevice.java:155) E/AndroidRuntime(2452): at com.developer.milancomm.UsbDriver.Check_Devices(UsbDriver.java:74) E/AndroidRuntime(2452): at com.developer.milancomm.UsbDriver.<init>(UsbDriver.java:48) E/AndroidRuntime(2452): at com.developer.milancomm.MainActivity$1.Check_Devices_Available(MainActivity.java:86) E/AndroidRuntime(2452): at com.developer.milancomm.MainActivity$1.onClick(MainActivity.java:63) E/AndroidRuntime(2452): at android.view.View.performClick(View.java:4240) E/AndroidRuntime(2452): at android.view.View$PerformClick.run(View.java:17721) E/AndroidRuntime(2452): at android.os.Handler.handleCallback(Handler.java:730) E/AndroidRuntime(2452): at android.os.Handler.dispatchMessage(Handler.java:92) E/AndroidRuntime(2452): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(2452): at android.app.ActivityThread.main(ActivityThread.java:5103) E/AndroidRuntime(2452): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(2452): at java.lang.reflect.Method.invoke(Method.java:525) E/AndroidRuntime(2452): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) E/AndroidRuntime(2452): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime(2452): at dalvik.system.NativeStart.main(Native Method) 

    3 Solutions collect form web for “Come risolvere java.lang.ArrayIndexOutOfBoundsException: lunghezza = 1; index = 1”

    Una lunghezza Array di 1 significa che esiste solo l'indice 0, perché in indici di arrays java inizia con 0!

    O in altre parole i limiti di un arrays sono Array.length -1

    lunghezza = 1 significa che l'arrays ha solo 1 elemento in esso e java è la numerazione basata su zero (il che significa che l'indexing di una matrix inizia da 0 e non 1).

    poiché si dispone solo di un elemento nell'arrays, ciò significa che è necessario accedervi con index = 0, non index = 1

    questo è ciò che l'errore cerca di dirti

    La Logcat indica che si sta verificando errori in questa row 74 nella class UsbDriver
    if (!conn.claimInterface(Device_Details.getInterface(1), true)) { ...} cercare di sostituire con 0 nel posto di 1. non so perché l'hai codificato con 1.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.