private static CatchHandlerList handlersFor(BasicBlock block, BlockAddresses addresses) {
    IntList successors = block.getSuccessors();
    int succSize = successors.size();
    int primary = block.getPrimarySuccessor();
    TypeList catches = block.getLastInsn().getCatches();
    int catchSize = catches.size();

    if (catchSize == 0) {
      return CatchHandlerList.EMPTY;
    }

    if (((primary == -1) && (succSize != catchSize))
        || ((primary != -1)
            && ((succSize != (catchSize + 1)) || (primary != successors.get(catchSize))))) {
      /*
       * Blocks that throw are supposed to list their primary
       * successor -- if any -- last in the successors list, but
       * that constraint appears to be violated here.
       */
      throw new RuntimeException("shouldn't happen: weird successors list");
    }

    /*
     * Reduce the effective catchSize if we spot a catch-all that
     * isn't at the end.
     */
    for (int i = 0; i < catchSize; i++) {
      Type type = catches.getType(i);
      if (type.equals(Type.OBJECT)) {
        catchSize = i + 1;
        break;
      }
    }

    CatchHandlerList result = new CatchHandlerList(catchSize);

    for (int i = 0; i < catchSize; i++) {
      CstType oneType = new CstType(catches.getType(i));
      CodeAddress oneHandler = addresses.getStart(successors.get(i));
      result.set(i, oneType, oneHandler.getAddress());
    }

    result.setImmutable();
    return result;
  }
Makes the {@link CatchHandlerList} for the given basic block.

@param block {@code non-null;} block to get entries for
@param addresses {@code non-null;} address objects for each block
@return {@code non-null;} array of entries
android/android_framework/dex-maker/src/main/java/com/android/dx/dex/code/StdCatchBuilder.java