【问题标题】:getting an illegal argument exception获得非法参数异常
【发布时间】:2011-04-01 15:47:36
【问题描述】:
import org.jsoup.Jsoup;
import javax.swing.*;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


@SuppressWarnings("unused")
public class SimpleWebCrawler extends JFrame  {

    JTextField yourInputField = new JTextField(20);
    static JTextArea _resultArea = new JTextArea(100, 100);
    JScrollPane scrollingArea = new JScrollPane(_resultArea);
    private final static String newline = "\n";



    public SimpleWebCrawler() throws MalformedURLException {

        String word2 = yourInputField.getText();


        _resultArea.setEditable(false);



        try {
            URL my_url = new URL("http://" + word2 + "/");
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    my_url.openStream()));
            String strTemp = "";
            while (null != (strTemp = br.readLine())) {
                _resultArea.append(strTemp + newline);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        _resultArea.append("\n");
        _resultArea.append("\n");
        _resultArea.append("\n");


        String url = "http://" + word2 + "/";
        print("Fetching %s...", url);

        try{
        Document doc = Jsoup.connect(url).get();
        Elements links = doc.select("a[href]");


        System.out.println("\n");

        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\user\\fypworkspace\\FYP\\Link\\abc.txt"));
        _resultArea.append("\n");
        for (Element link : links) {
            print("  %s  ", link.attr("abs:href"), trim(link.text(), 35));

            bw.write(link.attr("abs:href"));
            bw.write(System.getProperty("line.separator"));
        }
        bw.flush();
        bw.close();
        } catch (IOException e1) {

        }
        JPanel content = new JPanel();
        content.setLayout(new BorderLayout());
        content.add(scrollingArea, BorderLayout.CENTER);
        content.add(yourInputField);



        this.setContentPane(content);
        this.setTitle("Crawled Links");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.pack();




        }

        private static void print(String msg, Object... args) {

            _resultArea.append(String.format(msg, args) +newline);
        }

        private static String trim(String s, int width) {
            if (s.length() > width)
                return s.substring(0, width - 1) + ".";
            else
                return s;


        }

        //.. Get the content pane, set layout, add to center




    public static void main(String[] args) throws IOException {



        JFrame win = new SimpleWebCrawler();
        win.setVisible(true);



    }
}

您好,这是我从网址中提取链接的代码。用户将键入所需的 URL,此代码将从 URL 中提取链接。

此代码提示用户在 ECLIPSE IDE 控制台中键入 URL。键入输入后,代码将从 URL 中提取链接并将输出传输到 JTextArea。

我现在想做的是,我想创建一个 Jtextfield 来接收用户输入,而不是控制台内输入中的用户键。

负责处理字符串输入的代码行是:

 URL my_url = new URL("http://" + word2 + "/");
 String url = "http://" + word2 + "/";

但是我得到了一个非法的参数异常,它描述了

protocol = http host = null.

我错过了什么?

【问题讨论】:

    标签: java jsoup


    【解决方案1】:

    这里的问题是您试图过早地制定 URL;甚至在创建 GUI 之前。所以 word2 只是一个空字符串,所以 URL 看起来像 "http:///" 这是无效的。尝试添加JButton 并尝试在按下按钮时从网页中提取链接。

    【讨论】:

      【解决方案2】:

      构造对象时,您正在创建一个新的、新鲜的 JTextField。但是,您不会在任何地方显示此 JTextField,因此用户无法在其中输入数据。因为他们不能输入数据,所以当你调用 getText() 时,新创建的 JTextField 返回 null。

      最好的办法是在表单上显示 JTextField 并仅在有人单击“开始”后运行 HTTP Crawl,或者更好地更改构造函数以接受作为 URL 的基本主机的 String 参数你想下载。然后 SimpleWebCrawler 完成所有工作,然后您可以构建另一个显示表单的类。

      例如

          public SimpleWebCrawler(String word2) throws MalformedURLException {
      
          // We don't need this any more
          //String word2 = yourInputField.getText();
      
          _resultArea.setEditable(false);
      
      
      
          try {
              URL my_url = new URL("http://" + word2 + "/");
              BufferedReader br = new BufferedReader(new InputStreamReader(
                      my_url.openStream()));
              String strTemp = "";
              while (null != (strTemp = br.readLine())) {
                  _resultArea.append(strTemp + newline);
              }
          } catch (Exception ex) {
              ex.printStackTrace();
          }
      
          // Rest of your constructor goes here...
      

      【讨论】:

      • 嗨,从我的代码来看,我创建 jtextfield 对吗?我需要 jtextfield 提示用户输入输入然后运行代码。
      • 您需要先创建 JTextField,然后显示它并让用户输入一些文本,然后才能使用该文本运行网络爬虫。目前,您在用户有机会输入任何文本之前运行网络爬虫。
      • 这是否意味着我需要在 SimpleWebCrawler 类之外创建一个文本字段?
      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多