对象构造但仍为null

时间:2012-01-04 15:30:10

标签: java debugging

此源代码有什么问题?

 1  package Core;
 2  
 3  import java.sql.*;
 4  
 5  public class Course extends Model {
 6      
 7      protected int id;
 8      protected String title;
 9      
10      public Course(int id) {
11          this.id = id;
12      }
13      
14       public static Course getNew(ResultSet res) {
15          try {
16              Course c;
17              c = new Course(res.getInt("course_id"));
18              return c;
19          } catch(SQLException e) {
20              return null;
21          }
22      }
23      
24      @Override
25      public String toString() {
26          return this.title;
27      }
28  }

我在第17,18和11行设置了断点(按执行流程的顺序提到),对象肯定是构造的,但在第18行,它将返回null而不是对象。

我错过了什么?

请不要告诉我静态方法有多糟糕,我知道。帮助我理解为什么会发生这种情况以及如何解决它。

我在linux x64上使用netbeans + glassfish + java 7(openjdk)。

附录

好的问题可能就是我在调用它的方式 - 我正在使用反射和泛型。

来电者看起来像这样

 1  package Core;
 2  
 3  import java.sql.*;
 4  import java.util.*;
 5  import java.lang.reflect.*;
 6  
 7  /**
 8   * Represents storable elements in a database
 9   */
10  public abstract class Model {
11      /**
12       * this attribute is common to all models of the app
13       * this way we can reuse the same connection for
14       * everything (good or bad, depending on the project's requirements; in
15       * our case it's good - this should be a simple application, no mysql
16       * replication and things like that)
17       */
18      protected static Connection conn = null;
19      
20       public static void setConnection(Connection c) {
21          Model.conn = c;
22      }
23       
24       public static void initStatements() throws SQLException {
25           
26       }
27       
28       protected <T extends Model> HashMap<String, Model> resultsetMap(Class<T> cls, ResultSet res) {
29           HashMap<String, Model> data = new HashMap<String, Model>();
30           Method m;
31           try {
32              m = cls.getMethod("getNew", ResultSet.class);
33              
34           } catch(Exception e) {
35               return null;
36           }
37           
38           
39           try {
40               while(res.next()) {
41                   T obj = (T) m.invoke(null, res);
42                   data.put(obj.toString(), obj);
43               }
44           }
45           catch(Exception e) {
46               return null;
47           }
48           return data;
49       }
50       
51       @Override
52       public abstract String toString();
53       
54       public static Model getNew(ResultSet res) {
55           return null;
56       }
57  }

在第41行,我正在调用上述方法getNew()。我最终在地图中使用null s,包括键和值。

第28行的方法就像这样调用

return this.<Course>resultsetMap(Course.class, res);

很抱歉所有的混乱,我找到了(像往常一样愚蠢)原因title类的Course没有设置。

4 个答案:

答案 0 :(得分:6)

如果到达第18行,则它不能为空。但是,如果您正在调试旧版本,或者您只是未到达第18行,则可能是您输入catch块并出现异常。

所以,经验法则 - 不要丢弃例外。首先,使用ex.printStackTrace()在控制台中查看它。

然后直接尝试return new Course(res.getInt("course_id"));

答案 1 :(得分:0)

您确定第18行会返回null而不是第20行吗?你捕获异常似乎有点不寻常,但是没有正确处理它......

答案 2 :(得分:0)

如果在18 c的断点处不为null且函数返回null,则发生SQLException。

答案 3 :(得分:0)

抱歉所有的混乱,我发现(像往常一样愚蠢)原因:title类的Course未设置。