【问题标题】:DAO loading dataDAO loading data
【发布时间】:2015-09-30 14:09:43
【问题描述】:

我正在尝试使用 DAO 访问 MySQL 数据库中的数据。我想将数据输出到数组,但我有 java.lang.NullPointerException。请帮我解决这个问题。

PlayersWindow.java

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                PlayersWindow window = new PlayersWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public PlayersWindow() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
    initialize();
}
    private void initialize() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {

            IDAO dao = DAOFactory.getDAOInstance(TypeDAO.MySQL);
            Player mas[] = dao.loadPlayers(); //HERE IT GIVES NULLPOINTEREXCEPTION

            Object[] headers = { "id", "name", "playing pos", "height", "weight", "nationality", "date birth" };

            model = new DefaultTableModel(headers, 0);   
            model.addRow(mas);
            playersTable = new JTable(model);
}

MeSQLDAO.java

public class MySQLDAO implements IDAO{

    private static String GET_PLAYERS = "SELECT * FROM fbdb.Players";
    Connection con = null;
    public MySQLDAO() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        String url = "jdbc:mysql://localhost/fbdb";
        con = DriverManager.getConnection(url,"root","root"); 
    }

    public Player[] loadPlayers() throws SQLException{

        Player [] mas = null;
        PreparedStatement st = con.prepareStatement(GET_PLAYERS);
        ResultSet rs = st.executeQuery();
        rs.last();
        mas = new Player[rs.getRow()];
        rs.first();
        int i =0;
        while (rs.next()){
            mas[i] = new Player (rs.getInt(1), rs.getString(2), rs.getString(3), rs.getInt(4),
                    rs.getInt(5), rs.getString(6), rs.getDate(7));

            i++;
        }
        return mas; 
    }
}

DAOFactory.java

public class DAOFactory {
    private static IDAO dao = null;
    public static IDAO getDAOInstance(TypeDAO type){
        if(type == TypeDAO.MySQL){
            if(dao == null){
                dao = new MySQLDAO();
            }
            else return dao;    
        }
        return null;
    }
}

IDAO.java

public interface IDAO {

    Player[] loadPlayers() throws SQLException;
    public boolean savePlayer(Player p) throws SQLException;
    public boolean deletePlayer(Player p) throws SQLException;
    Player editPlayer(Player p) throws SQLException;
}

TypeDAO.java

 public enum TypeDAO {
        MySQL;
    }

例外:

java.lang.NullPointerException
    at fbApp.PlayersWindow.initialize(PlayersWindow.java:119)
    at fbApp.PlayersWindow.<init>(PlayersWindow.java:91)
    at fbApp.PlayersWindow$1.run(PlayersWindow.java:70)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$400(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

【问题讨论】:

  • 您在哪里获得 NPE ?你能提供错误跟踪吗?
  • @AmitBhati 在Window.initialize(),行Player mas[] = dao.loadPlayers();

标签: java mysql dao


【解决方案1】:

问题是您总是在 DaoFactory 中返回 null。以下是解决方法:

public class DAOFactory {
private static IDAO dao = null;
public static IDAO getDAOInstance(TypeDAO type){
    if(type == TypeDAO.MySQL){
        if(dao == null){
            dao = new MySQLDAO();
        }    
    }
    return dao;
}
}

编辑:这是一个更紧凑的形式:

public class DAOFactory {
  private static IDAO dao = null;
  public static IDAO getDAOInstance(TypeDAO type){
    if((type == TypeDAO.MySQL)&&(dao == null))dao = new MySQLDAO();   
    return dao;
  }
}

【讨论】:

  • 它仍然给出异常(
  • 这很奇怪……你是照原样复制的吗?我会把它放在一个更兼容的形式中,以便您轻松检查。检查更新的答案。
  • 对不起,我真的弄错了..你的两个解决方案都很好用!谢谢)
  • 很高兴能为您提供帮助! :D
【解决方案2】:

更改您的 DAOFactory 实现,如下所示:

public class DAOFactory {
    private static IDAO dao = null;
    public static IDAO getDAOInstance(TypeDAO type){
        if(type == TypeDAO.MySQL){
            if(dao == null){
               return dao = new MySQLDAO();
            }
            else return dao;    
        }
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 2013-09-22
    • 2018-12-08
    • 2013-03-12
    • 2020-07-04
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多