Java объект нулевой после экземпляра и вызова внутри метода

Может кто-нибудь помочь мне с этим вопросом, я работаю с Java с помощью SQLMap(ibatis). у меня есть 3 класса, который является MainConfiguration, SQLMap, DBUtility.

  1. Основная конфигурация (этот класс используется для установки объекта внутри класса SQLMap)

public class MainConfiguration
{
     public static String file = "configuration/db/SQLMapConfig.conf";

     public static void main(String[] args) throws Exception
     {
        new MainConfiguration().loadConfiguration();    
     }  

     public static void loadConfiguration()
     {
        SQLMap.setMapFile(file);
        List list = DBUtility.loadUsers();
     }
}
  1. Карта SQL (этот класс является геттером и сеттером и объекта)

public final class SQLMap
{
    private static SqlMapClient sqlMap;

    public static void setMapFile(String sMapFile)
    {
        try
        {
            sqlMap = SqlMapClientBuilder.buildSqlMapClient(new FileReader(sMapFile));
        }
        catch (Exception e)
        {
            throw new RuntimeException("Error initializing SqlMapClient class", e);
        }
    }

    public static SqlMapClient getSqlMapInstance()
    {
        return sqlMap;
    }
}
  1. DBUtility (это класс, где экземпляр объекта и получить объект из класса SQLMap)

    public class DBUtility
    {
    // object utility
    protected static SqlMapClient sqlMap = SQLMap.getSqlMapInstance();
    
    //constructor
    public DBUtility() throws Exception
    {
    }
    
    public static List loadUsers()
    {
        //it's working
        logger.info("SQLMap Get Instance = " + SQLMap.getSqlMapInstance());
    
        //it's not working
        logger.info("SQLMap Get Instance = " + sqlMap);
    
        //code below will be error because of null sqlMap
        try
        {
            listUser = sqlMap.queryForList("getUsers");
        }
        catch (Exception sqle)
        {
            logger.error("Error on load all user", sqle);
        }
        return listUser;
    }
    }
    

регистратор дай мне это:

SQLMap Get Instance = com.ibatis.sqlmap.engine.impl.SqlMapClientImpl@76707e36

SQLMap Get Instance = null

почему второй журнал дает мне ноль, даже если у меня есть экземпляр объекта?

1 ответ

Решение

Ваше поле sqlMap инициализируется при загрузке класса DBUtility, что, по-видимому, происходит раньше SQLMap.setMapFile(file); называется. Так, sqlMap указывает на разные вещи: null в статическом поле, и фактический экземпляр, когда вы вызываете геттер в loadUsers(),

Проблема в том, что DBUtility смотрит вверх sqlMap слишком рано. Это должно ждать, пока file передается SQLMap, Измените свой код следующим образом, чтобы отложить инициализацию DbUtility.sqlMap:

public static void loadConfiguration()
{
    SQLMap.setMapFile(file);
    DBUtility.initMapClient();  // notify DBUtility
    List list = DBUtility.loadUsers();
}

public class DBUtility
{
    protected static SqlMapClient sqlMap;  // do not initialize too early

    public static void initMapClient()
    {
        sqlMap = SQLMap.getSqlMapInstance();  // wait for SQLMap to be ready
    }

Конечно, было бы проще, если бы у вас даже не было sqlMap поле в DBUtility. Просто позвони SQLMap.getSqlMapInstance() каждый раз, когда вам это нужно. Это особенно важно в случае изменения экземпляра:

listUser = SQLMap.getSqlMapInstance().queryForList("getUsers");

Читать Когда инициализируются статические переменные? для более подробного объяснения статических полей.

Другие вопросы по тегам