在do-while循环中使用JSoup,仍然抛出异常

时间:2017-03-31 19:28:14

标签: java loops inheritance jsoup

当我尝试运行它并检查错误时,我注意到我的一个方法中的do-while循环允许在调用方法后非法输入后重新尝试。

我的问题是: 1)为什么PageScanner()方法中的do-while循环不起作用? 2)你能建议一个更好的方法来组织我的代码吗?

目前的情况如下:

头等舱:“BulkSpellChecker”(我试图整理代码的地方)

         import java.io.*;

public class BulkSpellChecker extends ParseCleanCheck {

    public static void main(String[] args) throws IOException {
        System.out.println("Let's get started!");

        PageScanner(); // Scan the page and clean it first
        System.out.println("Thanks for using the spell checker!");
    }}

第二类“ParseCleanCheck”(所有丑陋发生的地方)

import java.io.*;
import java.util.*;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;

public class ParseCleanCheck {

    static Scanner urlInput = new Scanner(System.in);
public static String cleanString = "";
public static String url = "";
public static boolean correct = true;

/**
 * PARSER METHOD
 */
public static void PageScanner() throws IOException {
    System.out.println("Pick a website to scan.");
    System.out.println("Enter a URL, starting with http://");

    do { // This do-while loop allows the user to try again after a mistake
        try {
            url = urlInput.nextLine();
            correct = false;
        } catch (Exception e) {
            System.out.println("Incorrect format for a URL.");
        }
    } while (correct == true);

    // This creates a document out of the HTML on the web page
    Document doc = Jsoup.connect(url).get();
    // This converts the document into a string to be cleaned
    String htmlToClean = doc.toString();
    cleanString = Jsoup.clean(htmlToClean, Whitelist.none());
}}
免责声明:我对编程很新,如果答案很明显,或者我发布了太多代码,我会道歉。如有必要,我可以编辑和删除代码。

2 个答案:

答案 0 :(得分:1)

虽然我不确定这是否是您的问题,但扫描仪可能难以使用,如果可能的话,我会避免使用它。在缓冲区已满之前,可能无法将该行传递给您。您可以尝试输入大量文本并查看它是否响应(我相信这是Windows行为,而不是真正的Java,并且它在Linux上可能表现不同)。另一个测试可能是将一个System.out.println放在nextLine之后,看看它是否会返回。我的猜测是,它不会从nextLine返回,直到你输入了一堆字符(不管回车)。

你可能会欺骗它从nextLine返回一个流结束字符(我认为它的ctrl-d或ctrl-z),但我相信这会关闭你的标准输入流而你赢了# 39;能够再次阅读它。

如果是我,我会根据我的要求采取两种方法之一。

一种方法是将其作为一次性程序运行。将所需文本放在命令行上,并从main()参数中读取。如果连接失败则打印错误并退出 - 用户可以通过按向上箭头并编辑最后一行来重新提交。一旦这个工作,您可以编写一个.cmd(或bash)批处理文件来启动您的Java应用程序,这样您就不必每次都输入那个笨拙的命令行。

第二种方法是使用Java输入框GUI之一。它们可以归结为几行代码,为您提供一个弹出对话框,用户可以在其中输入文本。

这样的事情应该有用(没有仔细检查,但我认为这是对的):

  String url = JOptionPane.showInputDialog(null, "Enter a URL to check");

如果第一次尝试失败,您可以轻松地将文本更改为"该URL无效,请输入其他网址重试"在第二次尝试。

如果url为null,则用户点击取消,所以退出。

答案 1 :(得分:1)

隔离代码帮助我将问题从一大块代码缩小到一小块文本。比尔K关于修复我的while条款的建议引导我把注意力集中在那里并最终得出答案。 Jsoup URL连接器应该保留在try-block中,否则程序无法判断它是否有效。一旦移动,它就开始完美地运作了。

如果其他人因试图循环jsoup而陷入困境,解决方案就在这里:

/**
     * PARSER METHOD
     */
    public static void PageScanner() throws IOException {
        System.out.println("Pick a website to scan.");

        // This do-while loop allows the user to try again after a mistake
        do {
            try {
                System.out.println("Enter a URL, starting with http://");
                url = urlInput.nextLine();
                // This creates a document out of the HTML on the web page
                Document doc = Jsoup.connect(url).get();
                // This converts the document into a string to be cleaned
                String htmlToClean = doc.toString();
                cleanString = Jsoup.clean(htmlToClean, Whitelist.none());
                correct = false;
            } catch (Exception e) {
                System.out.println("Incorrect format for a URL. Please try again.");
            }
        } while (correct);
    }