プロが教えるわが家の防犯対策術!

以下のコードを実行するとこのようなエラーが出てしまいます。エラー
を出さずにhtmlをパースしたいのですがどうすればよいでしょうか?
(httpが勝手にリンクされてしまうのでhを&x68;にしてあります)
置換してください。

java.lang.NullPointerException
at ParserTest$MyCallBack.handleText(ParserTest.java:78)
at javax.swing.text.html.parser.DocumentParser.handleText(Unknown Source)
at javax.swing.text.html.parser.Parser.handleText(Unknown Source)
at javax.swing.text.html.parser.Parser.endTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseContent(Unknown Source)
at javax.swing.text.html.parser.Parser.parse(Unknown Source)
at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source)
at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source)
at ParserTest.<init>(ParserTest.java:51)
at ParserTest.main(ParserTest.java:31)

以下ソース:



import java.io.*;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.&#x68;tml.parser.ParserDelegator;
import javax.swing.text.&#x68;tml.HTMLEditorKit;
import javax.swing.text.&#x68;tml.HTML;

import java.net.Socket;
import java.net.URL;
import java.net.SocketTimeoutException;

import java.io.*;
import java.nio.c&#x68;annels.*;

import java.util.Has&#x68;table;
import java.util.Enumeration;
import java.util.regex.*;
import java.lang.StringBuffer;
import java.lang.Integer;
import java.lang.Mat&#x68;;



public class ParserTest{
/**
* 引数でHTMLファイルを指定
*/
public static void main(String[] args) t&#x68;rows IOException, FileNotFoundException{
new ParserTest(new URL("&#x68;ttp://allabout.co.jp/internet/java/closeup/CU20060503A/index3.&#x68;tm"),80);
}
public ParserTest(URL url,int mPort)t&#x68;rows IOException, FileNotFoundException{


Socket TSock = new Socket(url.getHost(), mPort);
TSock.setSoTimeout(3000);

BufferedWriter SockOut = new BufferedWriter(new OutputStreamWriter(TSock.getOutputStream()));
SockOut.write("GET " + url.getPat&#x68;() + " HTTP/1.1\r\n");
SockOut.write("Host: " + url.getHost() + "\r\n");
SockOut.write("Connection: close\r\n\r\n");
SockOut.flus&#x68;();

InputStream IS = TSock.getInputStream();
InputStreamReader ScISR = new InputStreamReader( IS );


ParserDelegator parser = new ParserDelegator();
MyCallBack mycallback = new MyCallBack();
parser.parse(ScISR, mycallback, true);

Enumeration e = mycallback.&#x68;refs.keys();
w&#x68;ile (e.&#x68;asMoreElements()){
String buff =new String((String)e.nextElement());
String Temp;
if(mycallback.&#x68;refs.get(buff ).equals("小沢氏、民主公約修正に異議") ){
if(!buff.substring(0,6).equals("&#x68;ttp://")){
Temp = "&#x68;ttp://" + url.getHost() + buff;

}
System.out.println(buff + mycallback.&#x68;refs.get(buff ) );
}

}

}
private static class MyCallBack extends HTMLEditorKit.ParserCallback{
public Has&#x68;table<String,String> &#x68;refs = new Has&#x68;table<String,String>();
boolean f = false; String &#x68;ref="";

public void &#x68;andleStartTag(HTML.Tag t, MutableAttributeSet a, int pos){
if (t.equals(HTML.Tag.A)){
&#x68;ref = (String)a.getAttribute(HTML.Attribute.HREF);
}
}
public void &#x68;andleText(c&#x68;ar[] data, int pos){
if(&#x68;ref.lengt&#x68;() != 0){
//System.out.println(&#x68;ref);
&#x68;refs.put(&#x68;ref, new String(data));
//System.out.println(new String(data));
}
}
public void &#x68;andleEndTag(HTML.Tag t, int pos){
if (t.equals(HTML.Tag.TD)){
&#x68;ref = "";
}
}


}
}

A 回答 (1件)

>java.lang.NullPointerException


>at ParserTest$MyCallBack.handleText(ParserTest.java:78)
って出てるんだから、MyCallBackクラスのhandleTextメソッド(ファイルParserTest.javaの78行目)でnull値参照してるんでしょ。
だったらnullかどうか判定してから処理すればいいだけじゃない?

httpがリンクになるからって、全部の「h」を置換したんじゃぁ、読みにくくてかなわん。
    • good
    • 0
この回答へのお礼

ありがとうございます。
私エラーメッセージの見方が良くわかってませんでした。
そんな簡単な事だったのですね。nullかどうか確認するifを
入れたら回避する事ができました。

置換の件はすみませんでした。読みづらいコードを読んで
いただいてありがとうございました。

お礼日時:2009/08/10 18:36

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