code: public CrawlDatum next(){
          int topN = getConf().getTopN();
          int maxExecuteCount = getConf().getOrDefault(Configuration.KEY_MAX_EXECUTE_COUNT, Integer.MAX_VALUE);
  
          if(topN > 0 && totalGenerate >= topN){
              return null;
          }
  
          CrawlDatum datum;
          while (true) {
              try {
                  datum = nextWithoutFilter();
                  if (datum == null) {
                      return datum;
                  }
                  if(filter == null || (datum = filter.filter(datum))!=null){
                      if (datum.getExecuteCount() > maxExecuteCount) {
                          continue;
                      }
                      totalGenerate += 1;
                      return datum;
                  }
  
              } catch (Exception e) {
                  LOG.info("Exception when generating", e);
                  return null;
              }
  
          }
      }
docs: return null if there is no CrawlDatum to generate
  @return