Program: 39593
Project: 39593
Buggy source:
@Override public void parse(){
  long startTime=Calendar.getInstance().getTimeInMillis();
  InputStream fileIn=resources.openRawResource(resources.getIdentifier(resourceID,null,null));
  BufferedReader buffer=new BufferedReader(new InputStreamReader(fileIn));
  String line;
  co=new ParseObjectData(vertices,texCoords,normals);
  parseObjects.add(co);
  materialMap=new HashMap<String,ObjMaterial>();
  Log.d(Min3d.TAG,"String_Node_Str" + resourceID);
  Log.d(Min3d.TAG,"String_Node_Str" + startTime);
  try {
    while ((line=buffer.readLine()) != null) {
      StringTokenizer parts=new StringTokenizer(line,"String_Node_Str");
      int numTokens=parts.countTokens();
      if (numTokens == 0)       continue;
      String type=parts.nextToken();
      if (type.equals(VERTEX)) {
        Number3d vertex=new Number3d();
        vertex.x=Float.parseFloat(parts.nextToken());
        vertex.y=Float.parseFloat(parts.nextToken());
        vertex.z=Float.parseFloat(parts.nextToken());
        vertices.add(vertex);
      }
 else       if (type.equals(FACE)) {
        if (numTokens == 4) {
          co.numFaces++;
          co.faces.add(new ObjFace(parts,currentMaterialKey,3));
        }
 else         if (numTokens == 5) {
          co.numFaces+=2;
          co.faces.add(new ObjFace(parts,currentMaterialKey,4));
        }
      }
 else       if (type.equals(TEXCOORD)) {
        Uv texCoord=new Uv();
        texCoord.u=Float.parseFloat(parts.nextToken());
        texCoord.v=Float.parseFloat(parts.nextToken()) * -1f;
        texCoords.add(texCoord);
      }
 else       if (type.equals(NORMAL)) {
        Number3d normal=new Number3d();
        normal.x=Float.parseFloat(parts.nextToken());
        normal.y=Float.parseFloat(parts.nextToken());
        normal.z=Float.parseFloat(parts.nextToken());
        normals.add(normal);
      }
 else       if (type.equals(MATERIAL_LIB)) {
        readMaterialLib(parts.nextToken());
      }
 else       if (type.equals(USE_MATERIAL)) {
        currentMaterialKey=parts.nextToken();
      }
 else       if (type.equals(OBJECT)) {
        String objName=parts.hasMoreTokens() ? parts.nextToken() : "String_Node_Str";
        if (firstObject) {
          Log.d(Min3d.TAG,"String_Node_Str" + objName);
          co.name=objName;
          firstObject=false;
        }
 else {
          Log.d(Min3d.TAG,"String_Node_Str" + objName);
          co=new ParseObjectData(vertices,texCoords,normals);
          co.name=objName;
          parseObjects.add(co);
        }
      }
    }
  }
 catch (  IOException e) {
    e.printStackTrace();
  }
  long endTime=Calendar.getInstance().getTimeInMillis();
  Log.d(Min3d.TAG,"String_Node_Str" + (endTime - startTime));
}

Fixed version (ground truth):
@Override public void parse(){
  long startTime=Calendar.getInstance().getTimeInMillis();
  InputStream fileIn=resources.openRawResource(resources.getIdentifier(resourceID,null,null));
  BufferedReader buffer=new BufferedReader(new InputStreamReader(fileIn));
  String line;
  co=new ParseObjectData(vertices,texCoords,normals);
  parseObjects.add(co);
  materialMap=new HashMap<String,ObjMaterial>();
  Log.d(Min3d.TAG,"String_Node_Str" + resourceID);
  Log.d(Min3d.TAG,"String_Node_Str" + startTime);
  try {
    while ((line=buffer.readLine()) != null) {
      StringTokenizer parts=new StringTokenizer(line,"String_Node_Str");
      int numTokens=parts.countTokens();
      if (numTokens == 0)       continue;
      String type=parts.nextToken();
      if (type.equals(VERTEX)) {
        Number3d vertex=new Number3d();
        vertex.x=Float.parseFloat(parts.nextToken());
        vertex.y=Float.parseFloat(parts.nextToken());
        vertex.z=Float.parseFloat(parts.nextToken());
        vertices.add(vertex);
      }
 else       if (type.equals(FACE)) {
        if (numTokens == 4) {
          co.numFaces++;
          co.faces.add(new ObjFace(line,currentMaterialKey,3));
        }
 else         if (numTokens == 5) {
          co.numFaces+=2;
          co.faces.add(new ObjFace(line,currentMaterialKey,4));
        }
      }
 else       if (type.equals(TEXCOORD)) {
        Uv texCoord=new Uv();
        texCoord.u=Float.parseFloat(parts.nextToken());
        texCoord.v=Float.parseFloat(parts.nextToken()) * -1f;
        texCoords.add(texCoord);
      }
 else       if (type.equals(NORMAL)) {
        Number3d normal=new Number3d();
        normal.x=Float.parseFloat(parts.nextToken());
        normal.y=Float.parseFloat(parts.nextToken());
        normal.z=Float.parseFloat(parts.nextToken());
        normals.add(normal);
      }
 else       if (type.equals(MATERIAL_LIB)) {
        readMaterialLib(parts.nextToken());
      }
 else       if (type.equals(USE_MATERIAL)) {
        currentMaterialKey=parts.nextToken();
      }
 else       if (type.equals(OBJECT)) {
        String objName=parts.hasMoreTokens() ? parts.nextToken() : "String_Node_Str";
        if (firstObject) {
          Log.d(Min3d.TAG,"String_Node_Str" + objName);
          co.name=objName;
          firstObject=false;
        }
 else {
          Log.d(Min3d.TAG,"String_Node_Str" + objName);
          co=new ParseObjectData(vertices,texCoords,normals);
          co.name=objName;
          parseObjects.add(co);
        }
      }
    }
  }
 catch (  IOException e) {
    e.printStackTrace();
  }
  long endTime=Calendar.getInstance().getTimeInMillis();
  Log.d(Min3d.TAG,"String_Node_Str" + (endTime - startTime));
}