private boolean lastStmtIsThrowOrReturn(Statement stmt) {
    final List<Statement> stmts = asList(stmt);
    if (stmts.isEmpty()) {
      return false;
    }

    final Statement lastStmt = stmts.get(stmts.size() - 1);
    switch (lastStmt.getNodeType()) {
      case RETURN_STATEMENT:
      case THROW_STATEMENT:
        return true;

      case IF_STATEMENT:
        final IfStatement ifStmt = (IfStatement) lastStmt;
        final Statement thenStmt = ifStmt.getThenStatement();
        final Statement elseStmt = ifStmt.getElseStatement();
        return lastStmtIsThrowOrReturn(thenStmt)
            && (elseStmt == null || lastStmtIsThrowOrReturn(elseStmt));

      default:
        return false;
    }
  }