2012-01-04 3 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 вместо объекта.

Что мне не хватает?

Пожалуйста, не говорите мне, насколько плохими являются статические методы, я это знаю. Помогите мне понять, почему это происходит и как это исправить.

Я использую netbeans + glassfish + java 7 (openjdk) на linux x64.

Добавление

Ok поэтому проблема может быть в том, как я звоню его - я использую отражение и дженерики.

Вызывающий выглядит следующим образом

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 класса левый не установлен.

+0

Уверены ли вы, что не получаете исключения? Добавьте printStackTrace или подобное, прежде чем возвращать значение null в предложении catch. – z5h

+0

Вы уверены, что не столкнулись с этим «SQLException», который вы, кажется, глотаете? Вы возвращаете null из блока catch, возможно, отлаживаете это. –

+0

Возможно, вам следует указать, с чем вы отлаживаете, и где именно вы видите нулевое значение. При запуске – Viruzzo

ответ

6

Если вы достигли линии 18, то она не может быть нулевой. Но если вы отлаживаете более старую версию или просто не достигаете строки 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 будет возвращать null и не выравнивают 20? Кажется немного необычным, что вы поймаете исключение, но не обрабатываете его должным образом ...

+1

У него нет точки останова на линии 20. Итак, он не знает :-) – Gangnus

0

Если в точке останова в точке 18 c нет значения null, а функция возвращает значение null, вы получаете SQLException.

0

Извините за беспорядок, я нашел (тупой, как обычно) причину: title класса Course не используется.

Смежные вопросы