code: public CsvRow nextRow() throws IORuntimeException {
  		long startingLineNo;
  		List<String> currentFields;
  		int fieldCount;
  		while (false == finished) {
  			startingLineNo = ++lineNo;
  			currentFields = readLine();
  			if(null == currentFields) {
  				break;
  			}
  			fieldCount = currentFields.size();
  			// 末尾
  			if (fieldCount == 0) {
  				break;
  			}
  
  			// 跳过空行
  			if (config.skipEmptyRows && fieldCount == 1 && currentFields.get(0).isEmpty()) {
  				continue;
  			}
  
  			// 检查每行的字段数是否一致
  			if (config.errorOnDifferentFieldCount) {
  				if (firstLineFieldCount == -1) {
  					firstLineFieldCount = fieldCount;
  				} else if (fieldCount != firstLineFieldCount) {
  					throw new IORuntimeException(String.format("Line %d has %d fields, but first line has %d fields", lineNo, fieldCount, firstLineFieldCount));
  				}
  			}
  
  			// 记录最大字段数
  			if (fieldCount > maxFieldCount) {
  				maxFieldCount = fieldCount;
  			}
  
  			//初始化标题
  			if (config.containsHeader && null == header) {
  				initHeader(currentFields);
  				// 作为标题行后，此行跳过，下一行做为第一行
  				continue;
  			}
  
  			return new CsvRow(startingLineNo, null == header ? null : header.headerMap, currentFields);
  		}
  
  		return null;
  	}
docs: 读取下一行数据
  
  @return CsvRow
  @throws IORuntimeException IO读取异常