title: Class not found when Unmarshalling Android Intent Parcelable
body: <p>I have a <code>ArrayList</code> that I am passing between <code>activities</code>. In this <code>ArrayList</code> are objects made from a <code>class</code> that has four variables in it. One of those variables is another <code>ArrayList&lt;object&gt;</code> that is from another <code>class</code>.</p>
  
  <p>I have implemented <strong>Parcelable</strong> on both and am pretty sure I have completed the parcelable methods properly. Here are the errors: </p>
  
  <p><strong>Errors:</strong></p>
  
  <pre><code>03-18 02:37:27.063: D/dalvikvm(3249): GC_FOR_ALLOC freed 82K, 6% free 3020K/3180K, paused 1ms, total 3ms
  03-18 02:37:27.093: I/dalvikvm-heap(3249): Grow heap (frag case) to 3.626MB for 635808-byte allocation
  03-18 02:37:27.103: D/dalvikvm(3249): GC_FOR_ALLOC freed 5K, 5% free 3635K/3804K, paused 10ms, total 10ms
  03-18 02:37:27.173: D/(3249): HostConnection::get() New Host Connection established 0xb96396c0, tid 3249
  03-18 02:37:27.243: W/EGL_emulation(3249): eglSurfaceAttrib not implemented
  03-18 02:37:27.253: D/OpenGLRenderer(3249): Enabling debug mode 0
  03-18 02:37:27.293: W/EGL_emulation(3249): eglSurfaceAttrib not implemented
  03-18 02:37:32.383: D/dalvikvm(3249): GC_FOR_ALLOC freed 238K, 8% free 3911K/4224K, paused 1ms, total 1ms
  03-18 02:37:32.383: E/Parcel(3249): Class not found when unmarshalling: com.example.Choices
  03-18 02:37:32.383: E/Parcel(3249): java.lang.ClassNotFoundException: com.example.Choices
  03-18 02:37:32.383: E/Parcel(3249):     at java.lang.Class.classForName(Native Method)
  03-18 02:37:32.383: E/Parcel(3249):     at java.lang.Class.forName(Class.java:251)
  03-18 02:37:32.383: E/Parcel(3249):     at java.lang.Class.forName(Class.java:216)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readParcelable(Parcel.java:2097)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readValue(Parcel.java:2013)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readListInternal(Parcel.java:2343)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readArrayList(Parcel.java:1703)
  03-18 02:37:32.383: E/Parcel(3249):     at com.example.midterm.Question.&lt;init&gt;(Question.java:76)
  03-18 02:37:32.383: E/Parcel(3249):     at com.example.midterm.Question$1.createFromParcel(Question.java:98)
  03-18 02:37:32.383: E/Parcel(3249):     at com.example.midterm.Question$1.createFromParcel(Question.java:1)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readParcelable(Parcel.java:2104)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readValue(Parcel.java:2013)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readListInternal(Parcel.java:2343)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readArrayList(Parcel.java:1703)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readValue(Parcel.java:2034)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Bundle.unparcel(Bundle.java:249)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Bundle.getParcelableArrayList(Bundle.java:1250)
  03-18 02:37:32.383: E/Parcel(3249):     at com.example.midterm.TriviaActivity.onCreate(TriviaActivity.java:20)
  03-18 02:37:32.383: E/Parcel(3249):     at android.app.Activity.performCreate(Activity.java:5231)
  03-18 02:37:32.383: E/Parcel(3249):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
  03-18 02:37:32.383: E/Parcel(3249):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
  03-18 02:37:32.383: E/Parcel(3249):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
  03-18 02:37:32.383: E/Parcel(3249):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
  03-18 02:37:32.383: E/Parcel(3249):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Handler.dispatchMessage(Handler.java:102)
  03-18 02:37:32.383: E/Parcel(3249):     at android.os.Looper.loop(Looper.java:136)
  03-18 02:37:32.383: E/Parcel(3249):     at android.app.ActivityThread.main(ActivityThread.java:5017)
  03-18 02:37:32.383: E/Parcel(3249):     at java.lang.reflect.Method.invokeNative(Native Method)
  03-18 02:37:32.383: E/Parcel(3249):     at java.lang.reflect.Method.invoke(Method.java:515)
  03-18 02:37:32.383: E/Parcel(3249):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
  03-18 02:37:32.383: E/Parcel(3249):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
  03-18 02:37:32.383: E/Parcel(3249):     at dalvik.system.NativeStart.main(Native Method)
  03-18 02:37:32.383: E/Parcel(3249): Caused by: java.lang.NoClassDefFoundError: com/example/midterm/Choices
  03-18 02:37:32.383: E/Parcel(3249):     ... 34 more
  03-18 02:37:32.383: E/Parcel(3249): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.midterm.Choices" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib]]
  03-18 02:37:32.383: E/Parcel(3249):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
  03-18 02:37:32.383: E/Parcel(3249):     at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
  03-18 02:37:32.383: E/Parcel(3249):     at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
  03-18 02:37:32.383: E/Parcel(3249):     ... 34 more
  03-18 02:37:32.383: D/AndroidRuntime(3249): Shutting down VM
  03-18 02:37:32.383: W/dalvikvm(3249): threadid=1: thread exiting with uncaught exception (group=0xb2cb8b20)
  03-18 02:37:32.383: E/AndroidRuntime(3249): FATAL EXCEPTION: main
  03-18 02:37:32.383: E/AndroidRuntime(3249): Process: com.example.midterm, PID: 3249
  03-18 02:37:32.383: E/AndroidRuntime(3249): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.TriviaActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.Choices
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Handler.dispatchMessage(Handler.java:102)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Looper.loop(Looper.java:136)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.ActivityThread.main(ActivityThread.java:5017)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at java.lang.reflect.Method.invokeNative(Native Method)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at java.lang.reflect.Method.invoke(Method.java:515)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at dalvik.system.NativeStart.main(Native Method)
  03-18 02:37:32.383: E/AndroidRuntime(3249): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.midterm.Choices
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readParcelableCreator(Parcel.java:2147)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readParcelable(Parcel.java:2097)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readValue(Parcel.java:2013)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readListInternal(Parcel.java:2343)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readArrayList(Parcel.java:1703)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at com.example.Question.&lt;init&gt;(Question.java:76)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at com.example.midterm.Question$1.createFromParcel(Question.java:98)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at com.example.midterm.Question$1.createFromParcel(Question.java:1)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readParcelable(Parcel.java:2104)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readValue(Parcel.java:2013)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readListInternal(Parcel.java:2343)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readArrayList(Parcel.java:1703)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readValue(Parcel.java:2034)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Bundle.unparcel(Bundle.java:249)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.os.Bundle.getParcelableArrayList(Bundle.java:1250)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at com.example.midterm.TriviaActivity.onCreate(TriviaActivity.java:20)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.Activity.performCreate(Activity.java:5231)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
  03-18 02:37:32.383: E/AndroidRuntime(3249):     ... 11 more
  </code></pre>
  
  <p>As you can see, the first error that comes up is the <strong>Class not found</strong> when unmarshalling. </p>
  
  <p>Here's my <code>Question</code> class parcelable code: </p>
  
  <pre><code>/**
   * Constructs a Question from a Parcel
   * @param parcel Source Parcel
   */
  public Question (Parcel parcel) {
      this.id = parcel.readString();
      this.text = parcel.readString();
      this.image = parcel.readString();
      this.choices = parcel.readArrayList(null);
  }
  
  @Override
  public int describeContents() {
      return 0;
  }
  
  // Required method to write to Parcel
  @Override
  public void writeToParcel(Parcel dest, int flags) {
      dest.writeString(id);
      dest.writeString(text);
      dest.writeString(image);
      dest.writeList(choices);
  }
  
  // Method to recreate a Question from a Parcel
  public static Creator&lt;Question&gt; CREATOR = new Creator&lt;Question&gt;() {
  
      @Override
      public Question createFromParcel(Parcel source) {
          return new Question(source);
      }
  
      @Override
      public Question[] newArray(int size) {
          return new Question[size];
      }
  
  };
  </code></pre>
  
  <p>and <code>Choices</code>, my second class that is inserted as an ArrayList object into <code>Question</code>: </p>
  
  <pre><code>/**
   * Constructs a Choice from a Parcel
   * @param parcel Source Parcel
   */
  public Choices (Parcel parcel) {
      this.isCorrect = parcel.readByte() != 0;
      this.choice = parcel.readString();
  }
  
  @Override
  public int describeContents() {
      return 0;
  }
  
  @Override
  public void writeToParcel(Parcel dest, int flags) {
      dest.writeByte((byte) (isCorrect ? 1 : 0));
      dest.writeString(choice);
  }
  
  // Method to recreate a Question from a Parcel
  public static Creator&lt;Choices&gt; CREATOR = new Creator&lt;Choices&gt;() {
  
      @Override
      public Choices createFromParcel(Parcel source) {
          return new Choices(source);
      }
  
      @Override
      public Choices[] newArray(int size) {
          return new Choices[size];
      }
  
  };
  </code></pre>
  
  <p>I then use the following code to put an <code>ArrayList&lt;Question&gt;</code> into the intent: </p>
  
  <pre><code>Intent intent = new Intent(MainActivity.this, TriviaActivity.class);
  intent.putParcelableArrayListExtra(QUESTION_KEY, questions);
  startActivity(intent);
  </code></pre>
  
  <p>Where <code>questions</code> is the ArrayList. I have no errors in my code and can't figure out where I went wrong. Any help is greatly appreciated!</p>