- PR -

tomcat dom NullPointerExceptionについて

投稿者投稿内容
ベルトコンベア
常連さん
会議室デビュー日: 2006/10/25
投稿数: 31
投稿日時: 2006-10-25 16:38
xmlファイル検索機能をjspで作ろうと考えています。
全画面で検索語を受け取ってからの、jsp動作部分でerrorが起こり、どうもうまくいきません。
みなさんの助力をいただければと思い、投稿させていただきました。をどんな些細な事でもかまいません。よろしくお願いします。

error内容

The server encountered an internal error () that prevented it from fulfilling this request.

例外
org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

原因
java.lang.NullPointerException
org.apache.jsp.day04_002d4.p5_005faddSrch_jsp._jspService(org.apache.jsp.day04_002d4.p5_005faddSrch_jsp:69)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
注意 原因のすべてのスタックトレースは、Apache Tomcat/5.5.4のログに記録されています

<%@ page contentType="text/html;charset=Windows-31J"
import="javax.xml.parsers.*,org.w3c.dom.*" %>
<% request.setCharacterEncoding("Windows-31J"); %>
<html>
<head>
<title>試験名検索結果</title>
</head>
<body>
<h1 style="background:#cccccc">試験名検索結果</h1>
<%
int num;
boolean flag=false;
String strmoon="",strday="",strtest="",strplace="",strtxt1="",strmail="",strpass="",strtxt2="";

//全画面からのユーザーの入力をstrKeyに
String strKey=request.getParameter("name");
DocumentBuilderFactory objDbf=DocumentBuilderFactory.newInstance();
DocumentBuilder objDb=objDbf.newDocumentBuilder();
Document objDoc=objDb.parse(
application.getRealPath("tom02-1/houkoku.xml"));
Element objRoot=objDoc.getDocumentElement();
NodeList clnNod=objRoot.getChildNodes();
for(int i=0;i<clnNod.getLength();i++){
Node objNod=clnNod.item(i);
NodeList clnNod2=objNod.getChildNodes();
Node objNod2=clnNod2.item(0);
//検索語が見つかった場合にテキストノード取得。おそらくこのあたりでnulエラーが起
//こっているのではないかと考えています。
if(objNod2.getFirstChild().getNodeValue().equals(strKey)){
strmoon=clnNod2.item(1).getFirstChild().getNodeValue();
strday=clnNod2.item(2).getFirstChild().getNodeValue();
strtest=clnNod2.item(3).getFirstChild().getNodeValue();
strplace=clnNod2.item(4).getFirstChild().getNodeValue();
strtxt1=clnNod2.item(5).getFirstChild().getNodeValue();
strmail=clnNod2.item(6).getFirstChild().getNodeValue();
strpass=clnNod2.item(7).getFirstChild().getNodeValue();
strtxt2=clnNod2.item(.getFirstChild().getNodeValue();
flag=true;
break;
}
}
if(flag){
%>
<table border="0">
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">試験名</th>
<td><%=strKey %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">日時   月</th>
<td><%=strmoon %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">日</th>
<td><%=strday %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">内容</th>
<td><%=strtest %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">場所</th>
<td><%=strplace %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">概要</th>
<td><%=strtxt1 %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">方法</th>
<td><%=strmail %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">結果</th>
<td><%=strpass %></td>
</tr>
<tr>
<th style="color:#FFffFF;background:#0086b2; text-align:right;">その他の感想</th>
<td><%=strtxt2 %></td>
</tr>
</table>
<% }else{ %>
<div style="color:Red">指定された名前は見つかりません</div>
<% } %>
</body>
</html>

至らない所が多い文書で、申し訳ありません。

[ メッセージ編集済み 編集者: ベルトコンベア 編集日時 2006-10-26 08:58 ]
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-10-25 16:47
tomcatのworkディレクトリの下にjspがコンパイルされたjavaファイルがあるから、それを見てみましょう。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-10-25 16:52
引用:

//検索語が見つかった場合にテキストノード取得。おそらくこのあたりでnulエラーが起
//こっているのではないかと考えています。


そう思うのであれば、まずどこで発生しているのか確認してください。JSPに直接コード
が書かれているのでわかりにくいでしょうが、

引用:

java.lang.NullPointerException
org.apache.jsp.day04_002d4.p5_005faddSrch_jsp._jspService(org.apache.jsp.day04_002d4.p5_005faddSrch_jsp:69)


この通りエラーの出ている場所は示されているので、mioさんが書かれている通り出力
されたJSPを開いて発生箇所を確認してください。
ベルトコンベア
常連さん
会議室デビュー日: 2006/10/25
投稿数: 31
投稿日時: 2006-10-26 00:31
お返事ありがとうございます。
調べてみた結果、以下の部分でした。
69行目、if(objNod2.getFirstChild().getNodeValue().equals(strKey)){
中の変数の使い方の間違いなのかと思い、試してみたんですが、
駄目でした。その可能性が高いとは思ったんですが。
教えていただけないでしょうか。
どんな些細な情報でもいいので、よろしくお願いします。

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-10-26 01:29
引用:

if(objNod2.getFirstChild().getNodeValue().equals(strKey)){


元のXMLがわからないので何とも言えませんが、
上記の場合、
・objNod2がnull
・getFirstChild()の戻り値がnull
・getNodeValue()の戻り値がnull
のいずれかです。

objNod2が前のステートメントで利用できていることを考えると、
objNod2がnullではないことは確かです。

XMLとメソッドの実行によって、どのようなケースでnullが返されるかを
APIドキュメントを読んでみてください。
適切なnullに対する処理を行うべきでしょう。

ドットで繋げて記述するのもいいですが、
どこでnullが返されているか、わかりづらくなります。
最低限のデバッグ技術を身に付けてからにした方がいいと思います。
ベルトコンベア
常連さん
会議室デビュー日: 2006/10/25
投稿数: 31
投稿日時: 2006-10-26 10:50
おはようございます。
mioさん、ukさん、かつのりさん。お返事ありがとうございます。


ではドットを使わない記法であれば、69行目を
     Node objNod2=clnNod2.item(0);
Node objNod3=objNod2.getFirstChild();
Node objNod4=objNod3.getNodValue();
if( objNod4.equals(strKey)){
のようにするという事でいいのでしょうか。
エラー内容が変わったので、それについて調べようと考えています。

エラー箇所
     10行目の部分で、 
      <%

エラー内容 
     The method getValue() is undefined for the type Node


[ メッセージ編集済み 編集者: ベルトコンベア 編集日時 2006-10-26 11:57 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-10-26 11:42
引用:

ではドットを使わない記法であれば、69行目を
     Node objNod2=clnNod2.item(0);
Node objNod3=objNod2.getFirstChild();
Node objNod4=objNod3.getNodValue();
if( objNod4.equals(strKey)){
のようにするという事でいいのでしょうか。



そのように一度、一時変数に格納することで
途中経過を確認しやすくなります。
その状態でステップ実行する(今回はJSPなのでやりにくいですが)とか、
間にSystem.out.println()を入れるとかするとデバッグしやすいですね。

地味で面倒なデバッグ手法ですが、
「急がば回れ」といいますか、効果は大きいですね。

# かなり最近におなじような話をしたような?
ベルトコンベア
常連さん
会議室デビュー日: 2006/10/25
投稿数: 31
投稿日時: 2006-10-26 16:30
上記の訂正です。

エラー内容(訂正)
The method item(int) is undefined for the type Node

エラー箇所(先程と一緒です)
10行目 <%

この内容について調べようと考えています。

[ メッセージ編集済み 編集者: ベルトコンベア 編集日時 2006-10-26 16:34 ]

スキルアップ/キャリアアップ(JOB@IT)