Program: 101629
Project: 101629
Buggy source:
public Key readIndex(){
  checkActive();
  SwordBookMetaData bmd=getBookMetaData();
  String charset=bmd.getBookCharset();
  keys=new DefaultKeyList(null,bmd.getName());
  boolean isDailyDevotional=bmd.getBookCategory().equals(BookCategory.DAILY_DEVOTIONS);
  Calendar greg=new GregorianCalendar(1972,Calendar.JANUARY,1);
  DateFormat nameDF=new SimpleDateFormat("String_Node_Str");
  long entries;
  try {
    entries=idxRaf.length() / IDX_ENTRY_SIZE;
  }
 catch (  IOException ex) {
    Reporter.informUser(this,ex);
    return keys;
  }
  for (long entry=0; entry < entries; entry++) {
    try {
      byte[] buffer=SwordUtil.readRAF(idxRaf,entry * IDX_ENTRY_SIZE,IDX_ENTRY_SIZE);
      int offset=SwordUtil.decodeLittleEndian32(buffer,0);
      int size=SwordUtil.decodeLittleEndian32(buffer,4);
      byte[] data=SwordUtil.readRAF(datRaf,offset,size);
      int keyend=SwordUtil.findByte(data,SEPARATOR);
      if (keyend == -1) {
        DataPolice.report("String_Node_Str" + offset + "String_Node_Str"+ new String(data)+ "String_Node_Str");
        continue;
      }
      byte[] keydata=new byte[keyend];
      System.arraycopy(data,0,keydata,0,keyend);
      String keytitle=SwordUtil.decode(keys,keydata,charset).trim();
      if (keytitle.endsWith("String_Node_Str")) {
        keytitle=keytitle.substring(0,keytitle.length() - 1);
      }
      if (isDailyDevotional) {
        String[] parts=StringUtil.splitAll(keytitle,'.');
        greg.set(Calendar.MONTH,Integer.parseInt(parts[0]) - 1);
        greg.set(Calendar.DATE,Integer.parseInt(parts[1]));
        keytitle=nameDF.format(greg.getTime());
      }
      Key key=new IndexKey(keytitle,offset,size,keys);
      keys.addAll(key);
    }
 catch (    IOException ex) {
      log.error("String_Node_Str",ex);
    }
catch (    NumberFormatException e) {
      log.error("String_Node_Str",e);
    }
  }
  return keys;
}

Fixed version (ground truth):
public Key readIndex(){
  checkActive();
  SwordBookMetaData bmd=getBookMetaData();
  String charset=bmd.getBookCharset();
  keys=new DefaultKeyList(null,bmd.getName());
  boolean isDailyDevotional=bmd.getBookCategory().equals(BookCategory.DAILY_DEVOTIONS);
  Calendar greg=new GregorianCalendar();
  DateFormat nameDF=DateFormat.getDateInstance(DateFormat.MEDIUM);
  long entries;
  try {
    entries=idxRaf.length() / IDX_ENTRY_SIZE;
  }
 catch (  IOException ex) {
    Reporter.informUser(this,ex);
    return keys;
  }
  for (long entry=0; entry < entries; entry++) {
    try {
      byte[] buffer=SwordUtil.readRAF(idxRaf,entry * IDX_ENTRY_SIZE,IDX_ENTRY_SIZE);
      int offset=SwordUtil.decodeLittleEndian32(buffer,0);
      int size=SwordUtil.decodeLittleEndian32(buffer,4);
      byte[] data=SwordUtil.readRAF(datRaf,offset,size);
      int keyend=SwordUtil.findByte(data,SEPARATOR);
      if (keyend == -1) {
        DataPolice.report("String_Node_Str" + offset + "String_Node_Str"+ new String(data)+ "String_Node_Str");
        continue;
      }
      byte[] keydata=new byte[keyend];
      System.arraycopy(data,0,keydata,0,keyend);
      String keytitle=SwordUtil.decode(keys,keydata,charset).trim();
      if (keytitle.endsWith("String_Node_Str")) {
        keytitle=keytitle.substring(0,keytitle.length() - 1);
      }
      if (isDailyDevotional) {
        String[] parts=StringUtil.splitAll(keytitle,'.');
        greg.set(Calendar.MONTH,Integer.parseInt(parts[0]) - 1);
        greg.set(Calendar.DATE,Integer.parseInt(parts[1]));
        keytitle=nameDF.format(greg.getTime());
      }
      Key key=new IndexKey(keytitle,offset,size,keys);
      if (keys.contains(key)) {
        keys.removeAll(key);
      }
      keys.addAll(key);
    }
 catch (    IOException ex) {
      log.error("String_Node_Str",ex);
    }
catch (    NumberFormatException e) {
      log.error("String_Node_Str",e);
    }
  }
  return keys;
}