teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記2:DAOサンプルのリンクを掲載

2015/11/10 12:36

投稿

argius
argius

スコア9396

answer CHANGED
@@ -46,3 +46,12 @@
46
46
  request.setAttribute("cdList", list);
47
47
 
48
48
  ```
49
+
50
+ ---
51
+
52
+ (追記2)
53
+
54
+ 上記の1について、実装例を書きましたのでリンクを載せておきます。
55
+
56
+ Java8版 簡易DAOサンプル (Gist)
57
+ [https://gist.github.com/argius/e71722f5cad6f79227fc](https://gist.github.com/argius/e71722f5cad6f79227fc)

1

防止策について追記

2015/11/10 12:36

投稿

argius
argius

スコア9396

answer CHANGED
@@ -1,4 +1,48 @@
1
1
  requestスコープのattribute`cdList`に値が設定されておらず、変数`cdList`が`null`になっている可能性が高そうです。
2
2
 
3
3
  サーブレットで、`request.setAttribute("cdList")`を正しく行っているかどうかを確認してみてください。
4
- 行っていても、if文などの分岐でそこを通らない可能性などがあれば、それも確認してください。
4
+ 行っていても、if文などの分岐でそこを通らない可能性などがあれば、それも確認してください。
5
+
6
+ ---
7
+
8
+ (追記)
9
+
10
+ 回答ではありませんが、このようなケースは良くあることなので、防止策について書かせていただきます。
11
+
12
+
13
+ JSP側で`NullPointerException`が発生すると追っかけにくくなりますので、下記のようにしてサーブレット側で防ぐようにします。
14
+
15
+
16
+ 1.DAOのselectメソッドが`null`を返さないようにする
17
+
18
+ DAOに限りませんが、戻り値が`null`になるようなメソッドはできるだけ書かないようにしましょう。
19
+
20
+ どのようなケースで`null`を返しているかにもよりますが、SELECTに失敗していれば例外をスローする、検索結果無しの場合は、戻り値が`List<Item>`なら、`Collections.emptyList()`を返すようにします。
21
+
22
+
23
+ 2.分岐によってセットし忘れがないようにする
24
+
25
+ if文などで、ifの方には書いたけどelseのところで`setAttribute`を忘れてしまうようなケースがあります。
26
+
27
+ `setAttribute`は分岐の中に書かないようにして、かつ`list`が`null`でないことを保証するとなお良いです。
28
+
29
+ 例:
30
+
31
+ ```lang-java
32
+
33
+ List<CDItem> list;
34
+ if ( ... ) {
35
+ list = dao.findById(id);
36
+ }
37
+ else {
38
+ list = dao.findAll();
39
+ }
40
+
41
+ if (list == null) {
42
+ throw new ServletException(); // システムエラー
43
+ }
44
+
45
+ // listがnullでないことが保証される
46
+ request.setAttribute("cdList", list);
47
+
48
+ ```