java.lang.InstantiationException: `DBPoolConnector' has no public zero-arg
constructor.

解决方案 »

  1.   

    你把代碼貼出來吧﹗不過按字面上的意思是不是說你的DBPoolConnector類沒有無參數的構造器
      

  2.   

    DBPoolConnector.java
    import java.sql.*;
    import javax.sql.*;
    import oracle.jdbc.pool.*;
    import java.util.*;
    import javax.naming.*;public class DBPoolConnector {  static private OracleConnectionCacheImpl dbPool = null;
      private static OracleConnectionPoolDataSource m_cpds = null;
      private static DBPoolConnector thisInstance = null;  private DBPoolConnector() throws Exception {
        if (thisInstance == null) dbConnect(); 
      }  public static void dbConnect() throws SQLException,Exception {    try {   
                        dbPool = new OracleConnectionCacheImpl();
              configureDataSource(dbPool);
              dbPool.setMaxLimit(5);
              dbPool.setMinLimit(1);
              dbPool.setCacheScheme(OracleConnectionCacheImpl.FIXED_RETURN_NULL_SCHEME);      
        } catch (SQLException e) {
           System.out.println("Connection to Database Pool fail : "+e.getMessage());
        }  }..........}
    我是在jsp中调用DBPoolConnector出错的
      

  3.   

    private DBPoolConnector() throws Exception {
        if (thisInstance == null) dbConnect(); 
      }
    改为
    public DBPoolConnector() throws Exception {
        if (thisInstance == null) dbConnect(); 
      }
      

  4.   

    可能是你在外面生成这个类的实例了。
    你可以这样改一下:
    private static DBPoolConnector thisInstance = new DBPoolConnector();
      

  5.   

    to Hodex,
        我对类方面不怎么清楚,不知道为什么要把private 改成 public ,
    另外可以问一下为什么类里面可以声明这个类的变量 :private static DBPoolConnector thisInstance = null;谢谢!!
      

  6.   

    private表示函數是私有的﹐只能在類中調用﹐你從外部是不能調用這個構造函數的﹐自然會出錯﹐而改為public後表示為公共的﹐就可在外部調用了但按你的程序的寫法﹐我覺得yuanmeng163(今天我有空)的說法是對的﹗類本身把構造器私有﹐就是不讓外部調用﹐而
    private static DBPoolConnector thisInstance = new DBPoolConnector();
    由於是靜態變量﹐在類裝載的時候就可以初始化BPoolConnector﹐而且是內部調用構造器﹐故不會出錯。你在外部可以直接使用DBPoolConnector.thisInstance
      

  7.   

    这段代码是singleton模式的典型实现,你要将if (thisInstance == null) dbConnect(); 部分代码移至dbConnect()方法中,并提供返回DBPoolConnector类实例的静态方法。例如,你可以将public static void dbConnect()...改为public static DBPoolConnector dbConnect()...。
    以上是该段代码重构的要点。
      

  8.   

    public class DBPoolConnector {  static private OracleConnectionCacheImpl dbPool = null;
      private static OracleConnectionPoolDataSource m_cpds = null;
      private static DBPoolConnector thisInstance =new DBPoolConnector() ;  private DBPoolConnector() throws Exception {
        if (dbPool == null) dbConnect(); 
      }
      
    ....}这样可以了吗?
    不过还有一个问题,因为我们现在做的是连接池的,但是有好几个database,而Singleton是不是这个类只能产生一个实例,那意思是不是我有多少database,我就要写多少个这样的程式。
      

  9.   

    你可以使用multiton(多例)模式来实现。
      

  10.   

    chesterwoo,
           谢谢!!