0

I try to implement dao objects factory: to get new instance of certain class (HUserDao) from map (HDaoFactory.creators) by class (HUser.class) us a key.

I have this code:

package com.hxx.model.dao;    
public interface DaoFactory {
        GenericDao getDao(Class dtoClass);
    }


package com.hxx.model.dao;
import java.util.Map;
public class HDaoFactory implements DaoFactory {

    public static Map<Class, DaoCreator> creators;

    public interface DaoCreator { 
        public GenericDao create();
    } 

    @Override
    public GenericDao getDao(Class dtoClass) {
        DaoCreator creator = creators.get(dtoClass); 
        if (creator == null) { 
        } 
        return creator.create(); 
    }

}

And during execution of static initialize block:

package com.hxx.model.core;

import com.hxx.model.dao.HDaoFactory;
import com.hxx.model.dao.HUserDao;
import java.util.logging.Level;
import java.util.logging.Logger;

public class HUser extends HObjectAbstract {
    public HUser() {
    }

    static {
        try {
            HDaoFactory.creators.put(HUser.class, new HDaoFactory.DaoCreator() {
                @Override
                public GenericDao create() {
                    return new HUserDao();
                }
            });
        } catch(Exception ex) {
            Logger.getLogger(HUser.class.getName()).log(Level.SEVERE, 
                HUser.class.getName().concat(".<init>: creating of dao instance has failed."));
                ex.printStackTrace(System.out);
        }
    }

thows NPE:

SEVERE: com.hxx.model.core.HUser.<init>: creating of dao instance has failed.
INFO: java.lang.NullPointerException
    at com.hxx.model.core.HUser.<clinit>(HUser.java:48)
    at com.hxx.controller.UserBean.<init>(UserBean.java:43)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:310)
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)

Is what I'm doing wrong?

PavelPraulov
  • 589
  • 6
  • 18

1 Answers1

0

The creators map seems to be not initialized anywhere, which results in the NullPointerException. There's a good thread here which explains very clearly how to track down NPEs.

Community
  • 1
  • 1
Robby Cornelissen
  • 91,784
  • 22
  • 134
  • 156
  • It happens all the time. The important thing to take away from this is that it's very easy to figure out the cause of the issue by yourself by analyzing the stack trace. – Robby Cornelissen Jun 14 '14 at 09:36