静态方法返回空的哈希图

Posted

技术标签:

【中文标题】静态方法返回空的哈希图【英文标题】:static method returns empty hashmap 【发布时间】:2015-07-22 20:09:35 【问题描述】:

我有一些代码,其中有 2 个类,A 和带有静态方法 B 的 util 类。B 类有一个由 A 调用的静态方法。这个静态方法返回一个 hashmap();虽然地图是由 B 类中的静态方法正确构建的,但当我从 A 调用 B 的这个方法时,地图是空的。有什么想法吗?

以下是 B 类中正确构建地图的静态方法。

package fileutils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import com.google.common.io.Files;

public class JarFileUtils 
    //Returns the sql queries as a MAP
public static Map<String, String> getSQLs(String jarFileFullPath)  
    Map<String, String> sqlData = new HashMap<String, String>();
    try 
         JarFile jarFile = new JarFile(jarFileFullPath);
         Enumeration enumeration = jarFile.entries();
         while (enumeration.hasMoreElements())
             sqlData = getSqlDataHelper(enumeration.nextElement(), jarFile);
         
         jarFile.close();      
     catch (IOException e) 
        e.printStackTrace();
    
    return sqlData;


//Helper to fetch SQL info
private static Map<String, String> getSqlDataHelper(Object obj, JarFile jarFile) 
 Map<String, String> sqls = new HashMap<String, String>();
  JarEntry entry = (JarEntry)obj;

  String path = "/"+entry.getName();
  if(Files.getFileExtension(path).equalsIgnoreCase("sql"))
    InputStream input;
    try 
        input = jarFile.getInputStream(entry);
        sqls.put(Files.getNameWithoutExtension(path), readSqlFile(input));   
     catch (IOException e) 
        e.printStackTrace();        
    
  
  System.out.println(sqls.toString());
  return sqls;      


//Reads the given SQL file
private static String readSqlFile(InputStream input) throws IOException 
      InputStreamReader isr = new InputStreamReader(input);
      BufferedReader reader = new BufferedReader(isr);
      StringBuilder sqlQuery = new StringBuilder();
      String line;
      while ((line = reader.readLine()) != null) 
          sqlQuery.append(line);
          sqlQuery.append("\n");
      
      reader.close();
      return sqlQuery.toString();
    

以下是我从 A 类调用上述静态方法的地方。由于某种原因,此映射的大小为零。

//Get the list of SQLs in the jar file
    Map<String,String> sqlsExtracted = JarFileUtils.getSQLs(currentProjectFullPath);
    System.out.println("size = "+currentProjectFullPath+" = "+sqlsExtracted.size());

请指教,

谢谢!

【问题讨论】:

给我们看一些代码 Rookie 不要对你太苛刻,但我们需要看一些代码示例来复制你所看到的内容。仅凭您的描述很难推断出发生了什么。 代码在上面共享 变量 'sqls' 未定义 这段代码有效吗? 放一些调试语句来验证控制流,看看发生了什么。 【参考方案1】:

添加我的评论作为可能的答案,因为它可能指向问题。

getSQLs() 正在遍历 jar 文件中的每个条目,但只返回最后一个条目的结果。也许最后一个条目不包含任何 sql 文件?

【讨论】:

以上是关于静态方法返回空的哈希图的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的哈希图按照我想要的顺序打印[重复]

在静态方法AJAX中访问非静态方法

pmd静态代码分析

c# 有调用一个类的静态方法,是不是执行这个类的构造函数

PowerMockito 模拟单个静态方法并返回对象

将哈希图转换为数组[重复]