• ベストアンサー

JSPでの画面表示の方法

こんばんは、今日も質問させていただきます。宜しくお願いします<(_ _)> データ入力用のJSPと入力データ確認用のJSP二枚があります。データ入力画面で名前とか住所を入力し、確認画面へ遷移しそこでキャンセルボタンでデータ入力画面に戻ったとき、さきほどいれた値を表示させたいのです。 <input type="radio" name="sex" value="0" <% if(bean.getSex != null || bean.getSex.equals("0")){%>checked<%}%>>男 ラジオボタンで男女を選択させるのですが、上記のbeanはビーンクラスのid名で、getSexはvalueの値を返すメソッドになります。(0が男で1が女) 初めてデータ入力する場合(bean.getSex != null )もしくは既に男を選択していた場合(bean.getSex.equals("0"))は「checked」を表示させるようにしているのですが、実行すると「java.lang.NullPointerException」というエラーがでます。 名前を入れるテキストボックスだけの場合は問題なく動きます。 <input type="text" name="name" value="<% if(bean.getName() != null){ %><%= bean.getName() %><% } %>" > 初期の場合は空白で、名前をいれて次の画面に遷移してキャンセルでまたもどってきた場合、きちんと値を保持しています。 2つともやっていることは同じなのに(少なくとも私はそう思うんです)、どうしてラジオボタンだけはエラーがでるのでしょうか? サーブレットで画面遷移し、メソッドの類は全部ビーンでまとめています。 お忙しいとは思いますが、ご教示のほど宜しくお願い致します<(_ _)>

質問者が選んだベストアンサー

  • ベストアンサー
  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.5

とおもったら早とちりしてました。 よくみたら。。。 想像するにBeanのコンストラクタで getSexで返すパラメータの初期化をしていないのではないでしょうか? もしくはnullで初期化しているとか??? だから bean.getSex().equals("0")のところで bean.getSex()がnullの可能性があり、 nullなものにたいして.equalsメソッドを使おうとするから 落ちているのだと思います。 もしgetSexで返すパラメータがStringなら""(空文字)を使ってコンストラクタで初期化しておきば大丈夫ですよ。

makinko0129
質問者

お礼

chi-kon様、お忙しい中の書き込みありがとうございます。 >bean.getSex().equals("0")のところで bean.getSex()がnullの可能性があり、 nullなものにたいして.equalsメソッドを使おうとするから 落ちているのだと思います。 >もしgetSexで返すパラメータがStringなら""(空文字)を使ってコンストラクタで初期化しておきば大丈夫ですよ。 chi-kon様の仰る通りでした。String型を使っているので、””と初期化したところ、「nullではなく」という条件をつけなくてもスムーズに動きました。とても嬉しかったです。 今回のことはとても勉強になりました。以後初期化をきちんとして、皆様の手を煩わせないよう精進致します。 この度は本当にありがとうございました<(_ _)>

その他の回答 (4)

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.4

ソースを全部みたわけではないのでなんともいえませんが、 JSPから利用しようとしているBeanがnullなためです。 <% if(bean.getSex().equals("0")){%> だからでるというわけでないんです。 このコードが出現するまでにnewされていれば、 nullpointerexceptionはでません。 いつbeanが実際に生成されるのかをつかめばわかるとおもいます。 まぁいつ生成されるかわからないものにたいしては (null_check && 条件)みたいにしておけばいいとおもいます。

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.3

<% if(bean.getSex != null && bean.getSex.equals("0")){%> にしてみたら?

makinko0129
質問者

補足

こんばんは。 今chi-kon様の書き込みを見て、下記のコードを実行してみたところ、無事動きました。(最初は男を選択させておきたいので) <% if(bean.getSex() != null && bean.getSex().equals("0")|| bean.getSex() == null){%> うーん、とても不思議です。 <% if(bean.getSex() != null && bean.getSex().equals("0")){%>  だと普通に動くのに、 <% if(bean.getSex().equals("0")){%> という条件だけだとなぜエラーがでるのでしょうか? 私には「bean.getSex() != null」がなければ何故エラーになるのかいまひとつわかりません。 「nullじゃなくて、かつvalueが0」という条件と「valueが0」という条件に大差はないように思えます。 もしご存知ならば、なぜエラーが出たのか教えていただけないでしょうか?

回答No.2

makinko0129さん bean.getSexをXと略しますね。 まず書かれたif文   if (X != null || X.equals("1") ) {(※1) というif文の条件としている論理式ですが、 「Xがnullではない、『または』、Xが"1"と等しい」ならば真(true)となります。 Javaでは2項論理演算子(||、&&)は、常に左辺を評価してから、その結果で演算子の演算結果が確定するならば右辺を評価せず、確定しないならば右辺を評価する動作が仕様となっています。 すなわち「A || B」は、まず「A」を評価します。Aが真(true)ならば、Bが真であろうと偽であろうと「A || B」は真になりますので、Bの評価は行いません。Aが偽(false)ならば、Bの真偽がわからないと「A || B」全体が確定しないため、Bを評価します。 「A || B」は、「AまたはBである」が直訳ですが、この動作を勘案すると「Aである、そうでない場合は、Bである」と意訳するのが適切かもしれませんね。 ちなみに「A && B」も、まず「A」を評価します。こちらはAが偽(false)ならば、Bが真であろうと偽であろうと「A || B」は偽になりますので、Bの評価は行いません。逆にAが真(true)ならば、Bの真偽がわからないと「A || B」全体が確定しないため、Bを評価します。 「A && B」は、「AかつBである」が直訳ですが、この動作を勘案すると「Aである、その上でBである」と意訳するのが適切かもしれませんね。 では、もとにif文にもどると、(※1)は、まず「Xがnullではない」を評価します。もし、それが真ならば「Xが"1"と等しい」を評価しません。もし、それが偽-すなわち「Xがnullである」ならば、「Xが"1"と等しい」を評価しようとします。ところが、「Xがnullである」にも関わらず、Xのequalsメソッドを呼んでしまっているため、NullPointerExceptionが発生しました。 さて、northcurlcurlさんの回答ですが、よーく、if文を見てください。   if (X == null || X.equals("1") ) { 若干異なりますね。なぜ、NullPointerExceptionが発生しなかった理由は考えてみてください。 とりあえず、先ほどに意訳にあてはめると「Xがnullである、そうでない場合は、Xが"1"と等しい」。 もうお分かりですね。

makinko0129
質問者

補足

run34ricky様、今回は私のためにこのような親切な回答をしてくださりありがとうございました。面識のない私のために時間を費やしてくださったことに感謝します。 さて、問題のNullPointerExceptionなのですが、いまだ解答が見つからぬままです。 northcurlcurl様が指摘してくださった部分であろう、if (X != null || X.equals("1") ) の部分ですが、そこは前回のときif (X == null || X.equals("1") ) に修正しました。それでもNullPointerExceptionがでるのです。「nullじゃない」から「nullである」に変更する部分以外、run34ricky様の回答を何度読み返しても見つけることができませんでした。 もしよければそれ以外に変更する点あればご教示していただきたく思います<(_ _)>

回答No.1

下記のプログラムを試してみれば、分かるでしょう。 import java.io.*; public class test{ private static String sex; public static String getSex() {return sex;} public static void main(String[] args) { if(getSex() == null || getSex().equals("0")) System.out.println("checked"); } }

makinko0129
質問者

補足

お忙しい中ありがとうございます。 早速上記のコードを実行してみたらきちんと「checked」とコマンドプロンプトには表示されました。 うーん、どこがいけないのかわかりませんでした。JSPのコードは <input type="radio" name="sex" value="0" <% if(bean.getSex() == null || bean.getSex().equals("0")){%><%=c%><%}%>>男 で、<%=c%>のcの中にはString型でcheckedをいれています。あと最初は「nullじゃなかったら」という条件にしていたのですが、northcurlcurl様の仰る通り「nullだったら」という条件にすべきでしたので、訂正しました。 それでも同じエラーがでるのです。 ビーンクラスでは ・public void setSex(HttpServletRequest req) {sex=req.getParameter("sex");} ・public String getSex() {return sex;} というメソッドを2つ用意していて、JSPで値を入力して確認ボタンを押すと一旦サーブレットのほうに遷移します。そこでsetSexをよびだし、ビーンごとセッションに関連付けています。そして確認画面のJSPに移るようにしています。 どこが問題なのかまだわからないので、お手数だとは思いますがもう少しヒントのほうお願いします<(_ _)>

関連するQ&A