title: pointerIndex out of Range multitouch
body: <p>At first, i really know there are more than one post about it, but non helped me fixing the bug/misstake. I am sorry if its a repost and hope you guys can help me getting rid of this bug.</p>
  
  <pre><code>11-28 17:36:36.110: W/dalvikvm(8380): threadid=1: thread exiting with uncaught exception (group=0x40a331f8)
  11-28 17:36:36.110: E/AndroidRuntime(8380): FATAL EXCEPTION: main
  11-28 17:36:36.110: E/AndroidRuntime(8380): java.lang.IllegalArgumentException: pointerIndex out of range
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.MotionEvent.nativeGetAxisValue(Native Method)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.MotionEvent.getX(MotionEvent.java:1974)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.main.TouchEventControler.processJoyPadTouchRelease(TouchEventControler.java:194)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.main.TouchEventControler.processRelease(TouchEventControler.java:237)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.main.TouchEventControler.processTouchEvent(TouchEventControler.java:88)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.main.GameField.onTouchEvent(GameField.java:142)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.View.dispatchTouchEvent(View.java:5546)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1938)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1375)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.app.Activity.dispatchTouchEvent(Activity.java:2364)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1886)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.View.dispatchPointerEvent(View.java:5726)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2890)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2466)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2475)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.os.Handler.dispatchMessage(Handler.java:99)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.os.Looper.loop(Looper.java:137)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at android.app.ActivityThread.main(ActivityThread.java:4424)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at java.lang.reflect.Method.invokeNative(Native Method)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at java.lang.reflect.Method.invoke(Method.java:511)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  11-28 17:36:36.110: E/AndroidRuntime(8380):     at dalvik.system.NativeStart.main(Native Method)
  </code></pre>
  
  <p>I do handle them like this and i am happy that it sometimes runs like i want it if it dont crash by that error:</p>
  
  <pre><code>public void processTouchEvent(MotionEvent event) {
  
      // create an action
      int action = (event.getActionMasked() &amp; MotionEvent.ACTION_MASK);
      // getting pointerindex
      int pointerIndex = ((event.getAction() &amp; MotionEvent.ACTION_POINTER_INDEX_MASK) &gt;&gt; MotionEvent.ACTION_POINTER_INDEX_SHIFT);
      // getting pointer id
  
      //catch invalide
      if(pointerIndex == MotionEvent.INVALID_POINTER_ID){
          return;
      }
  
      int pointerId = event.findPointerIndex(pointerIndex);
      // switch case for the action
      switch (action) {
      case MotionEvent.ACTION_DOWN: // if action down
          processHitButtonTouch(event, pointerId);
          processJoyPadTouch(event, pointerId);
          break;
      case MotionEvent.ACTION_POINTER_DOWN: // if pointer down (second
                                              // finger/third)
          processHitButtonTouch(event, pointerId);
          processJoyPadTouch(event, pointerId);
          break;
      case MotionEvent.ACTION_UP: // if action up
          processRelease(event, pointerId);
      case MotionEvent.ACTION_POINTER_UP: // if action up second/third finger
          processRelease(event, pointerId);
      default:
          break;
      }
  }
  </code></pre>
  
  <p>In the methodes i call in that switch i just get the position of the touch and handle them. I just could put a getX(pointerIndex) in a try catch and return if its a error. But isnt there a better way?! </p>
  
  <p>Thanks alot for all that help i already got. </p>
  
  <p>Asked for:</p>
  
  <pre><code>    public void processJoyPadTouchRelease(MotionEvent event, int pointerId) {
      int touchPosX = (int) event.getX(pointerId);
      int touchPosY = (int) event.getY(pointerId);
  
      if (( //dont freak out here! it's just looking for if the
              //touch was inside the Joypad! Nothing more!!
              //it's in breckets!
              touchPosX &gt; 2 * Config.BLOCKSIZE
              &amp;&amp; touchPosX &lt; 4 * Config.BLOCKSIZE
              &amp;&amp; touchPosY &gt; 3 * Config.BLOCKSIZE
              &amp;&amp; touchPosY &lt; 5 * Config.BLOCKSIZE
              // touch up event handled
              || 2 * Config.BLOCKSIZE &lt; touchPosX
              &amp;&amp; touchPosX &lt; (Config.BLOCKSIZE * 4)
              &amp;&amp; touchPosY &gt; (7 * Config.BLOCKSIZE)
              &amp;&amp; touchPosY &lt; (9 * Config.BLOCKSIZE)
              // touch down handled
              || (touchPosX &lt; 2 * Config.BLOCKSIZE
              &amp;&amp; touchPosY &gt; (5 * Config.BLOCKSIZE) 
              &amp;&amp; touchPosY &lt; (7 * Config.BLOCKSIZE))
              // touch left handled
              || (4 * Config.BLOCKSIZE &lt; touchPosX
              &amp;&amp; touchPosX &lt; (Config.BLOCKSIZE * 6)
              &amp;&amp; touchPosY &gt; (5 * Config.BLOCKSIZE) 
              &amp;&amp; touchPosY &lt; 7 * Config.BLOCKSIZE)) 
              //touch right handled
  
              //and the char isnt idle (so it's moving)
          &amp;&amp; charac.getStatus() != Status.IDLE)
      //THAN do =&gt;&gt;
      {
          charac.setStatus(Status.IDLE);
          joyPad.status = Status.IDLE;
      }
  }
  </code></pre>