2012-01-04 9 views
1

このソースコードには何が問題がありますか?オブジェクトは構築されていますが、まだヌルです

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があります設定されていません。

+0

例外が発生していませんか? catch節にnullを返す前にprintStackTraceなどを追加してください。 – z5h

+0

あなたはあなたが嚥下していると思われる 'SQLException'を実行していませんか? catchブロックからnullを返し、おそらくそれをデバッグします。 –

+0

多分あなたは何を使ってデバッグしているのか、そしてどこに正確にnull値があるのか​​を指定するべきです。実行時 – Viruzzo

答えて

6

18行目に達した場合、nullにすることはできません。しかし、古いバージョンをデバッグしている場合、または18行目に達していない場合は、例外を除いてcatchブロックを入力することができます。

大雑把に言えば、例外を破棄しないでください。まず、ex.printStackTrace()を使用してコンソールに表示してください。その後

直接return new Course(res.getInt("course_id"));

+0

例外はありませんが、18行目のリターンは実際にヒットしました。変数 'c'にマウスを戻す直前に、' null'が表示されます。私は 'clean&build'をしてから' deploy'してから 'debug'を実行するので、現在のバージョンでなければなりません。 – Flavius

+0

まったく例外がないので、まったく役に立たない。私が言っていることを注意深く読んで、私はプログラミングの初心者ではありません。 – Flavius

+0

最後の段落を確認してください。 – Bozho

0

を試してみてください、あなたは、ライン18は、20行目nullを返していないと確信していますか?あなたが例外をキャッチするのは少し珍しいようですが、正しく処理しません。

+1

彼は20行目にブレークポイントを持っていません。だから、彼は知りません:-) – Gangnus

0

18 cでブレークポイントがnullでなく、関数がnullを返すと、SQLExceptionが発生します。

0

すべての混乱のため申し訳ありませんが、Courseクラスのtitleは未設定のままです。

関連する問題