エラーを出さずにhtmlをパースする方法

このQ&Aのポイント
  • 以下のコードを実行するとエラーが発生し、htmlをパースすることができません。エラーを回避する方法を教えてください。
  • java.lang.NullPointerExceptionが発生していて、ParserTest$MyCallBack.handleTextメソッド内の78行目でエラーが発生しています。
  • 引数で指定されたURLのHTMLファイルを取得し、パースしていますが、エラーが発生しています。
回答を見る
  • ベストアンサー

ParserDelegator.parse(Unknown Source)

以下のコードを実行するとこのようなエラーが出てしまいます。エラー を出さずに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 = ""; } } } }

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

>java.lang.NullPointerException >at ParserTest$MyCallBack.handleText(ParserTest.java:78) って出てるんだから、MyCallBackクラスのhandleTextメソッド(ファイルParserTest.javaの78行目)でnull値参照してるんでしょ。 だったらnullかどうか判定してから処理すればいいだけじゃない? httpがリンクになるからって、全部の「h」を置換したんじゃぁ、読みにくくてかなわん。

JavaJavax2
質問者

お礼

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

関連するQ&A

  • String 型でのエラーがわかりません

    ただいま、データベースからデータを取得しています。 そこで、 ResultSet rs; // データベースから住所を取得する String strAddress = rs.getString("住所"); if ( !( strAddress.equals("") ) ) { // 以降は処理 住所に値が入っていないと、if 文のところでNullPointerエラーが出ます。 java.lang.NullPointerException at sCard.actionPerformed(sCard.java:500) at javax.swing.AbstractButton.fireActionPerformedUnknownsource) at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknow n Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 他のテストアプリケーションで、 String u = ""; if ( u.equals("") ) { System.out.println("OK"); } としても、エラーは出ません。 誰かわかる方がいたら教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • javaでスタート画面を作っていて困っています。

    現在javaでゲームのスタート画面を作っているのですが、パネルが透過されずに困っています。 プログラムソースは import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.*; import java.awt.Font; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; class Start最新版 extends JFrame{ public static void main(String args[]){ Start最新版 frame = new Start最新版("タイトル"); frame.setVisible(true); } Start最新版(String title){ setTitle(title); setBounds(10, 10, 1024, 768); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setOpaque( false ); ImageIcon icon1 = new ImageIcon("Start.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); JButton button1 = new JButton("ゲームを始める"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel n = new JPanel(); n.setOpaque(false); n.setLayout(new BoxLayout(n, BoxLayout.Y_AXIS)); n.add(Box.createRigidArea(new Dimension(290,30))); n.add(button1); となっています。「ゲームを始める」ボタンだけを残して、周りのパネルを透過して画像を表示させたいのですが、うまくいきません!解決方法をご存知の方どうか教えていただきたいです!よろしくお願いします。

  • javaのGUIツールキット

    javaのGUIツールキット * AWT(Abstract Window Toolkit) * Swing 上記の2種を用いる課題が出ているのですが、java.awtとjavax.swingの2つが必要とのことなので、ubuntu Linux上のSynapticパッケージマネージャにて検索をかけ、libcharva1-javaというパッケージをインストールしました。 その後 import java.awt.*; class TestFrame { public static void main(String argv[]) { Frame f = new Frame("Test"); f.setSize(300,200); f.setVisible(true); } } などのプログラムをコンパイルしてみたところ、 Exception in thread "main" java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it. at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source) at java.awt.Window.<init>(Unknown Source) at java.awt.Frame.<init>(Unknown Source) at javax.swing.JFrame.<init>(Unknown Source) at TestFrame.main(rensyuu1.java:6) とエラーが示されてしまいます。 これはどのように解決すればよいのでしょうか。 環境は以下のとおりです。 使用OS:WindowsVista vmwareにてubuntu-Linux8.1をエミュレート JDK6もインストール済みなのですがどうにもうまくいきません。 どうか解答よろしくお願い致します。

  • Javaでタイマーの使い方

    Javaでタイマーの使い方作り方がわかりません import javax.swing.Timerこれつかいます。 package Test1; import javax.swing.Timer; public class Test1 { Timer TM = new Timer(10, null); public static void main(String[] args) { } } よろしくお願いします。

    • ベストアンサー
    • Java
  • setAutoCommit(false)で例外発生してしまいます

    はじめまして。fswmiyajimaと申します。 現在JavaでDBを使用した簡単なスタンドアロンアプリケーションを作成しています。 DBにはMicrosoft Access(ojdbc14 + Microsoft Access Driver 4.00.6305.00)を利用しています。 開発環境では問題無くテストまで終わっていたのですが、 別のPCに持っていった時、例外が発生していまいました(末尾に記載)。 問題は、トランザクション開始時(setAutoCommit(false))に発生します。 尚、DBとなるmdbファイルはNASに存在し、そのファイルを見るように各PCのODBCマネージャーで設定しています。 少し調べを入れてみましたが、プロバイダがトランザクションをサポートしていないのが原因である、という記述を見つけました。 しかし、開発環境では問題なく動作しているので、どこに原因があるのか突き止められず、困っています。 どうかご教示いただければと思います。よろしくお願いします。 例外全文 java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]属性を設定できません。 at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) at sun.jdbc.odbc.JdbcOdbc.SQLSetConnectOption(Unknown Source) at sun.jdbc.odbc.JdbcOdbcConnection.setAutoCommit(Unknown Source) at dbcommon.MSAccessCon.transactionBegin(MSAccessCon.java:30) at view.Main.exec(Main.java:315) at view.Main.access$0(Main.java:309) at view.Main$1.actionPerformed(Main.java:112) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) ※Main.java:315: con.setAutoCommit(false); ※このconはConnectionオブジェクトで、このコネクションを用いてのselect句の発行はどの環境でも正常に行えています。

    • ベストアンサー
    • Java
  • 参照されない

    クラスSentenceActionperformedのtext1,textの部分がエラーとなります。クラスは呼ばれています。二つとも参照?されていないのです。 参考になるページをみると同じような書き方しているのに問題ないのでどこが違うのかわかりません。この書き方では参照でなきないのだと思いますが正しい書き方がわかりません。別のクラスにしていく方法でいきたいです。 うまく行けばtextの文字がtext1に表示されます。 よろしくお願いします。 import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JTextArea; import javax.swing.JTextField; public class sample extends javax.swing.JFrame{ public sample() { init(); } private void init() { JTextField text = new JTextField(25); JTextArea text1 = new JTextArea(10,25); Container mainFrame = getContentPane(); mainFrame.setLayout(new FlowLayout()); mainFrame.add(text); mainFrame.add(text1); mainFrame.setBounds(0, 0, 500, 500); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); SentenceActionPerformed aa = new SentenceActionPerformed(); text.addActionListener(aa); } class SentenceActionPerformed implements ActionListener{ public void actionPerformed(ActionEvent evt) { text1.setText(text.getText()); } } public static void main(String args[]) { new sample().setVisible(true); } }

    • ベストアンサー
    • Java
  • handleText()で取得したテキストが文字化けしてしまいます。

    タイトルの通りです。入出力について一応自分なりに調べてみましたが、出力したファイルへの文字化けが直りません。下にコードを書いています。 どうかよろしくお願いします。 import java.io.*; import java.net.*; import javax.swing.text.MutableAttributeSet; import javax.swing.text.html.*; import javax.swing.text.html.parser.ParserDelegator; class MyParserCallback extends HTMLEditorKit.ParserCallback { String[] text = new String[1000]; int k=0; public void handleText(char[] data, int pos) { text[k] = new String(data); k++; } } public class test { String[] line = new String[10000]; public test() { try { URL url = new URL("http://www.goo.ne.jp/"); HttpURLConnection uc = (HttpURLConnection) url.openConnection(); uc.setUseCaches(false); BufferedReader br = new BufferedReader(new InputStreamReader(uc .getInputStream())); BufferedWriter bout = new BufferedWriter(new FileWriter("test.txt")); MyParserCallback cb = new MyParserCallback(); ParserDelegator pd = new ParserDelegator(); pd.parse(br, cb, true); for(int i=0; i<cb.text.length; i++) { if(cb.text[i] == null) { continue; } bout.write(cb.text[i]); bout.newLine(); } //終了処理 br.close(); bout.close(); } catch (MalformedURLException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } } public static void main(String[] args) { test t = new test(); } }

    • ベストアンサー
    • Java
  • テキストフィールドの文字をテキストエリアに表示する

    エラーも例外もないです。 但し今回の内容の"テキストフィールドに打ち込みエンターキーを文字をテキストフィールドに表示" が満たしてないですとりあえずソース乗せます mport java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyMemo { public static void main(String[] args) { JFrame Frame = new JFrame("課題"); Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Frame.setSize(500, 500); Frame.setLocationRelativeTo(null); Container contentPane = Frame.getContentPane(); // テキストフィールドのインスタンスを生成 final JTextField text = new JTextField();// テキストエリアのインスタンスを生成 text.addActionListener(new MyActionListener()); Frame.setVisible(true); final JTextArea Area = new JTextArea(5,0); // スクロールペインにテキストエリアを追加 JScrollPane scrollPane = new JScrollPane(Area); // パネルをコンポーネントに配置 contentPane.add(text, BorderLayout.NORTH); contentPane.add(scrollPane, BorderLayout.CENTER); Frame.setVisible(true); } static class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { } } } どう文字をテキストエリアに表示したらいいのかわからなくて質問させていただきました。 よろしくお願いします。

    • ベストアンサー
    • Java
  • StyledDocumentの背景色の不具合

    標記の件、JTextPaneにDefaultStyledDocumentを設定して、テキスト編集環境を 構築していますが、デフォルトでのフォントの背景色が正しく取得できません。 フォントのデフォルトの背景色は見た目には白なのですが、 取得される背景色は黒(r=0,g=0,b=0,a=255)になってしまっています。 背景色を適当に設定すると、その部分の色は正しく反映されます。 マニュアルで背景色を黒く設定しているのか、無設定で背景色が黒として取得されて いるのかの判別方法がなく困っております。 以下、サンプルコードを示します。 対処法をご存知の方がおられましたら、よろしくお願いいたします。 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JTextPane; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; import javax.swing.text.StyledDocument; public class StyledDocumentText { public static void main(String[] args) { final StyledDocument document = new DefaultStyledDocument(new StyleContext()); JTextPane textPane = new JTextPane(document); textPane.addCaretListener( new CaretListener(){ public void caretUpdate(CaretEvent e) { // キャレット位置の背景色を取得し、コンソール出力 AttributeSet a = document.getCharacterElement(e.getDot()).getAttributes(); Color background = StyleConstants.getBackground(a); System.out.printf( " %s a=%d\n", background ,background.getAlpha() ); } } ); // テキスト挿入 try { document.insertString(0, "abcdefg", null); } catch (BadLocationException e) { e.printStackTrace(); } // マニュアルで背景色を設定 MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setBackground(attr, new Color(255,100,50,230) ); document.setCharacterAttributes( 2, 3, attr, false); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add( textPane ); frame.setSize( 300, 300 ); frame.setVisible( true ); } }

  • キャレットの幅を設定したい。

    キャレットの幅を設定したい。 以下のソースで色を設定するメソッドはありますが、 キャレットの幅の設定の仕方が解りませんでした。 ご存じの方がおられましたら教えてください。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; class test extends JFrame{ public static void main(String args[]){ new test(); } test(){ this.setSize(300, 250); JPanel p = new JPanel(); JTextArea area2 = new JTextArea("test", 10, 10); area2.setCaretColor(Color.RED); p.add(area2); this.add(p, BorderLayout.CENTER); this.setVisible(true); } }

    • ベストアンサー
    • Java

専門家に質問してみよう