【问题标题】:Hashmap is value is null everytimesHashmap 如果值每次都为空
【发布时间】:2020-03-08 14:46:42
【问题描述】:

我正在创建一个哈希图,其中我的键是字符串,值是列表。从 excel 我正在读取所有行值并添加到列表中。然后列表映射到键。但是当尝试一个键的值时,它会返回 null。请让我知道代码中有什么问题。

    private static void FCToProjectsMapping(String RefFilename)
  {
    System.out.println(RefFilename);

    Workbook wb = null;
    HashMap<String, ArrayList<String>> MappingFCInProjects = new HashMap<String, ArrayList<String>>();

    try
    {
      if (RefFilename == null || RefFilename.isEmpty()) 
      {
        System.out.println("Workbook is empty or Not available");
      }
      try
      {
        wb = new XSSFWorkbook(new FileInputStream(RefFilename));
      }
      catch(Exception e)
      {
        System.out.println(e);
      }

      Sheet sheet = wb.getSheet("Sheet0");

      int TotalColumnNo = sheet.getRow(1).getLastCellNum();

      for (int ColNo = 2; ColNo < TotalColumnNo; ColNo++)
      {
        ArrayList<String> itemList=new ArrayList<String>();

        String FCNAME = sheet.getRow(1).getCell(ColNo).getStringCellValue().trim();
        String ClassificationNAME = sheet.getRow(2).getCell(ColNo).getStringCellValue().trim();
        String AltNo = sheet.getRow(3).getCell(ColNo).getStringCellValue().trim();
        String Version = FCNAME + "/" + AltNo + "_" + ClassificationNAME;

        for (int RowNo=5; RowNo <= sheet.getLastRowNum(); RowNo++)
        {
          if(sheet.getRow(RowNo).getCell(ColNo)!=null && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty())
          { 
              String ProjectName = "";

              if(sheet.getRow(RowNo).getCell(ColNo)!=null && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty())
              { 
                ProjectName = sheet.getRow(RowNo).getCell(1).getStringCellValue().trim();               
                itemList.add(ProjectName);
              }
          }
        }
        if(!MappingFCInProjects.containsKey(Version))
        {
          MappingFCInProjects.put(Version, itemList); 
        }
        itemList.clear();
      }          
      wb.close();      

    }
    catch(Exception error)
    {
      System.out.println("Error occured in FCToProjectsMapping function is "+ error);
    }

  }

【问题讨论】:

  • 调试并检查您的代码是否向数组列表添加了一些值。

标签: java list hashmap


【解决方案1】:

您将itemList 插入到地图中,然后将其清除,因此现在地图中有一个空列表。 put(Version, itemList) 调用不会复制列表,它会插入列​​表本身。

删除itemList.clear(); 行,那部分代码就可以工作了。

其他问题:

  • 您应该使用new XSSFWorkbook(new File(RefFilename)),这样您就不会将整个文件加载到内存中。

  • 您应该删除 new XSSFWorkbook 调用周围的 try-catch,并让最后的 catch 处理它。

  • 其实你应该使用try-with-resources

    if (RefFilename == null || RefFilename.isEmpty()) 
    {
      System.out.println("Workbook is empty or Not available");
      return; // <== add this to prevent NullPointerException
    }
    try (XSSFWorkbook wb = new XSSFWorkbook(new File(RefFilename)))
    {
      ...
    
  • 由于您只是丢弃 itemList 而不使用它,因此您应该在 RowNo 循环之前执行以下操作:

    if (! MappingFCInProjects.containsKey(Version))
    {
      continue; // skip processing of column
    }
    

【讨论】:

    【解决方案2】:

    它为空的原因是,当您创建一个新列表并将项目放入其中时,您会清除相同的列表。 for (int ColNo = 2; ColNo 在这一行创建一个列表

                String FCNAME = sheet.getRow(1).getCell(ColNo).getStringCellValue().trim();
                String ClassificationNAME = sheet.getRow(2).getCell(ColNo).getStringCellValue().trim();
                String AltNo = sheet.getRow(3).getCell(ColNo).getStringCellValue().trim();
                String Version = FCNAME + "/" + AltNo + "_" + ClassificationNAME;
    
                for (int RowNo = 5; RowNo <= sheet.getLastRowNum(); RowNo++) {
                    if (sheet.getRow(RowNo).getCell(ColNo) != null
                            && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty()) {
                        String ProjectName = "";
    
                        if (sheet.getRow(RowNo).getCell(ColNo) != null
                                && !sheet.getRow(RowNo).getCell(ColNo).getStringCellValue().isEmpty()) {
                            ProjectName = sheet.getRow(RowNo).getCell(1).getStringCellValue().trim();
                            itemList.add(ProjectName);
                        }
                    }
                }
                if (!MappingFCInProjects.containsKey(Version)) {
                    MappingFCInProjects.put(Version, itemList);
                }
                itemList.clear();//YOU CLEAR THE SAME INSTANCE
            }
    

    //您应该注释行 itemList.clear 以使其工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多