「みんな教えて! 選手権!!」開催のお知らせ

JSPを勉強中なのですが、以下を実行するとエラーになってしまいます。
テキストに付録していた解答のコードを使っています。

JSPファイル:
<%@ page contentType="text/html;charset=Windows-31J"
import="javax.xml.parsers.*,org.w3c.dom.*,java.io.*" %>
<html><head><title>住所録一覧</title></head><body>
<h1 style="font-size:14pt;background:#cccccc">住所録一覧</h1>
<table border="0">
<tr style="background:#00ccff">
<th>No.</th><th>名前</th><th>性別</th><th>電話番号</th><th>住所</th>
</tr>

<%
DocumentBuilderFactory objDbf=DocumentBuilderFactory.newInstance();
DocumentBuilder objDb=objDbf.newDocumentBuilder();
Document objDoc=objDb.parse(new File(application.getRealPath("day04-3/addbook.xml")));
Element objRoot=objDoc.getDocumentElement();
NodeList clnNod=objRoot.getChildNodes();

for(int i=0;i<clnNod.getLength();i++)
{
out.println("<tr style='background:#ffffcc'>");
Node objNod=clnNod.item(i);
NamedNodeMap clnNnm=objNod.getAttributes();
Attr atrNam=(Attr)clnNnm.item(0);
out.println("<td>" + atrNam.getValue() + "</td>");
NodeList clnNod2=objNod.getChildNodes();

for(int j=0;j<clnNod2.getLength();j++)
{
Node objNod2=clnNod2.item(j);
out.println("<td>" + objNod2.getFirstChild().getNodeValue() + "</td>");
}
out.println("</tr>");
}
%>
</table></body></html>

XMLファイル:
ファイル名:addbook.xml
<?xml version="1.1" encoding="utf-8"?>
<addbook>
<member id="1">
<name>高橋秀和</name>
<gender>男</gender>
<tel>04x-231x-123x</tel>
<address>小金井市△△町123-3249</address>
</member>

<member id="2">
<name>輪笠貴子</name>
<gender>女</gender>
<tel>00x-1231-xxxx</tel>
<address>横浜市○○区△△町34165-1</address>
</member>
<member id="3">
<name>佐々木健司</name>
<gender>男</gender>
<tel>04x-231x-xxxx</tel>
<address>川崎市○○町1-3213</address>
</member>
<member id="4">
<name>鳥内都</name>
<gender>女</gender>
<tel>09x-21xx-xx97</tel>
<address>横浜市◇◇区5-16</address>
</member>
<member id="5">
<name>金崎瑞穂</name>
<gender>女</gender>
<tel>02x-654x-324x</tel>
<address>相模原市△△区1-9-21</address>
</member><member id="10">
<name>川端真一</name>
<gender>男</gender>
<tel>0xx-999-8888</tel>
<address>相模原市★★町12313-1</address>
</member>
</addbook>

エラー内容:
type 例外レポート
メッセージ

説明 The server encountered an internal error () that prevented it from lfilling this request.

例外
org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
day10.LogFilter.doFilter(LogFilter.java:38)


原因

java.lang.NullPointerException
org.apache.jsp.day04_002d4.addList_jsp._jspService(addList_jsp.java:79)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
day10.LogFilter.doFilter(LogFilter.java:38)

以上です。
JSPのコードは
Document objDoc=objDb.parse(new File(application.getRealPath("day04-3/addbook.xml")));
の行の new File の部分だけ修正しました。
ここでつまづてしまい、先に進む事ができません。
環境は、
JDK1.6
Tomcat6
OS:WindowsXP
を使用しています。
どなたか原因が分かる方、お助けください。

A 回答 (2件)

JAVA のAPI リファレンス


http://java.sun.com/javase/ja/6/docs/ja/api/org/ …
にNodeの説明の説明がありますから、参考にして下さい。

Nodeがmenberの所まで来た時に、
----------------------------------------------------------------------
if ("member".equals(objNod.getNodeName())) {
  // ●member ノードへ対する処理
  String id = "";
  String name = "";
  
  if (objNod.hasAttributes()) {
    NamedNodeMap clnNnm = objNod.getAttributes();
    Attr atrNam = (Attr)clnNnm.getNamedItem("id");
    id = atrNam.getValue();
  }
  
  if (objNod.hasChildNodes()) {
    NodeList clnNod2=objNod.getChildNodes();
    for (int j = 0; j < clnNod2.getLength(); j++) {
      Node objNod2 = clnNod2.item(j);
      if ("name".equals(objNod2.getNodeName())) {
        name = objNod2.getTextContent();
      }
    }
  }
  
  out.println("<td>" + id + "</td>");
  out.println("<td>" + name + "</td>");
}
----------------------------------------------------------------------
のような処理を入れてあげると良いと思います。
# エラー処理は省略してあるので、実際に実装する時は、エラー処理もして下さい。
    • good
    • 0
この回答へのお礼

コードまで書いていただき申し訳ないです。
全くその通りの処理で問題なく表示されました。
(name以外のNodeも同様の処理を追加しました。)
Nodeの構造が自分が想像していたものと違っていたんですね。

これで次のステップへ進めそうです。
非常に助かりました。ありがとうございました。。

お礼日時:2008/12/04 20:10

>Node objNod=clnNod.item(i);


>NamedNodeMap clnNnm=objNod.getAttributes();
>Attr atrNam=(Attr)clnNnm.item(0);
>out.println("<td>" + atrNam.getValue() + "</td>");
>NodeList clnNod2=objNod.getChildNodes();

例外が出ている原因は、アトリビュートの無いノードに対して、
objNod.getAttributes();を呼び出しているために、ここでnullが戻ってきますので、
clnNnmがnullである時に、clnNnm.item(0);などとしている
ためNullPonterExceptionとなっているようです。

この手の処理は、トレースと変数のダンプをしっかりやれば簡単に原因を突き止められる
はずですので、ロギング処理を追加するか、デバッガを使用すると良いでしょう。

ところで、本当は、どのような動作を期待されていましたか?

この回答への補足

すみません、画像無理だったのでテキストで、

住所録一覧
No. 名前      性別   TEL        住所
1    高橋秀和  男  04x-231x-123x  小金井市△△町123-3249
2   輪笠貴子    女  00x-1231-xxxx  横浜市○○区△△町34165-1
3   佐々木健司   男  04x-231x-xxxx  川崎市○○町1-3213
4   鳥内都      女  09x-21xx-xx97  横浜市◇◇区5-16
5   金崎瑞穂    女  02x-654x-324x  相模原市△△区1-9-21
10  川端真一    男  0xx-999-8888   相模原市★★町12313-1

こんな感じで表示される処理です。

補足日時:2008/12/03 21:51
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
どんな状態になっているか調べようと自分なりに少しいじくってみたのですが、
コード:
Element objRoot=objDoc.getDocumentElement();
String TT = objRoot.getNodeName();
out.println(TT );
結果→addbook

コード:
NodeList clnNod=objRoot.getChildNodes();
Node objNod=clnNod.item(0);
String TT2 = objNod.getNodeName();
out.println(TT2 );
結果→#text

コード:
Node objNod2=clnNod.item(1);
String TT3 = objNod2.getNodeName();
out.println(TT3 );
結果→member

となってclnNod.item()の値を1~12まで変化させてみたところ、
1:#text
2:member
3:#text
4:member
5:#text
6:member
7:#text
8:member
9:#text
10:member
11:member
12:#text
と表示されました。
#textというものが何なのか分かりません…
memberの配下にname、gender、tel、addressがあるものじゃないんでしょうか??

動作は説明しづらいので画像をキャプチャしたので載せておきます。
おそらくこの通りに表示されるはずなのですが…

お礼日時:2008/12/03 21:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報