title: How to fix java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
body: <p>I am creating an android application that consists of a serial communication.I am getting an error <strong>called java.lang.ArrayIndexOutOfBoundsException: length=1; index=1</strong> please tell me how to fix it</p>
  
  <p>This is my usb driver:</p>
  
  <pre><code>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&lt;String, UsbDevice&gt; devlist = mUsbManager.getDeviceList();
          Iterator&lt;UsbDevice&gt; deviter = devlist.values().iterator();
          Device_Details = null;
          if (devlist.size() != 0) {              
              while (deviter.hasNext()) {
                  Device_Details = deviter.next();
                  if (Device_Details.getVendorId() == VID &amp;&amp; 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 &lt; 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 &amp;&amp; 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, "&gt;==&lt;" + msg.toString() + " &gt;==&lt;");
      }
  
      private void e(Object msg) {
          Log.e(TAG, "&gt;==&lt; " + msg.toString() + " &gt;==&lt;");
      }
  }
  </code></pre>
  
  <p>This is my usb connection handler</p>
  
  <pre><code>public interface UsbConnectionHandler {
      void onUsbStopped();
      void onErrorLooperRunningAlready();
      void onDeviceNotFound();
  }
  </code></pre>
  
  <p>This is my main activity:</p>
  
  <pre><code>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&lt;String, UsbDevice&gt; 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&lt;5 &amp;&amp; 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.array(); 
                              for(i=0;i&lt;64;i++){
                                  if(sample[i]=='&amp;'){
                                      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]&amp;0x00FF)&lt;&lt;8) + (sample[3]&amp;0x00FF));
  
                                  //Total_Frame_Decoded=true;
                                  //sample = null;
                              }
                          }
                      }
                  }
              });
  
              private void Send_Communication_Check_Command() {
                  long i,j;
                  Communication_Byte[0]='&amp;';
                  UsbDriver.USB_Device_Connection.bulkTransfer(UsbDriver.Data_Out_End_Point,Communication_Byte, 1, 0);
                  for(i=0;(i&lt;1000 &amp;&amp; Communication_Ok!=true) ;i++)    
                      for(j=0;(j&lt;1000 &amp;&amp; Communication_Ok!=true);j++);
              }
          });
      }
  
  }
  </code></pre>
  
  <p>This is my logcat:</p>
  
  <pre><code>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.&lt;init&gt;(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)
  </code></pre>