このソースコードには何が問題がありますか?オブジェクトは構築されていますが、まだヌルです
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)を使用しています。
補遺
[OK]を問題は、私はそれを呼んでいる方法であってもよいので - 私は反射やジェネリックを使用しています。
呼び出し側は、ライン41、私は上記の方法getNew()
を呼んだ上で、この
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 }
のように見えます。私はnull
で、キーと値の両方のマップになります。
ライン28上の方法は、すべての混乱のために
return this.<Course>resultsetMap(Course.class, res);
申し訳ありませんが、このように呼ばれて、は私が原因(いつものように、愚かな)を見つけた:Course
クラスのtitle
があります設定されていません。
例外が発生していませんか? catch節にnullを返す前にprintStackTraceなどを追加してください。 – z5h
あなたはあなたが嚥下していると思われる 'SQLException'を実行していませんか? catchブロックからnullを返し、おそらくそれをデバッグします。 –
多分あなたは何を使ってデバッグしているのか、そしてどこに正確にnull値があるのかを指定するべきです。実行時 – Viruzzo