Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在do while循环中使用JSoup,仍然引发异常_Java_Loops_Inheritance_Jsoup - Fatal编程技术网

Java 在do while循环中使用JSoup,仍然引发异常

Java 在do while循环中使用JSoup,仍然引发异常,java,loops,inheritance,jsoup,Java,Loops,Inheritance,Jsoup,当我尝试运行它并检查错误时,我注意到我的一个方法中的do while循环在调用该方法时不起作用,该循环允许在非法输入后重试 我的问题是: 1) 为什么PageScanner()方法中的do while循环不起作用? 2) 你能建议一个更好的方法来组织我的代码吗 这就是它目前的样子: 第一堂课:“BulkSpellChecker”(我试图组织代码的地方) 第二类“ParseCleanCheck”(所有丑陋的事情都发生在这里) 免责声明:我对编程相当陌生,如果答案显而易见或者我发布了太多代码,我深表

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

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

这就是它目前的样子:

第一堂课:“BulkSpellChecker”(我试图组织代码的地方)

第二类“ParseCleanCheck”(所有丑陋的事情都发生在这里)


免责声明:我对编程相当陌生,如果答案显而易见或者我发布了太多代码,我深表歉意。如果需要,我可以编辑和删除代码。

虽然我不确定这是否是您的问题,但扫描仪可能很难使用,如果可能,我会避免使用。在缓冲区已满之前,它可能不会将该行传递给您。您可以尝试输入大量文本,看看它是否有响应(我相信这是windows的行为,而不是java的行为,在Linux上可能会有不同的行为)。另一个测试可能是将System.out.println放在下一行之后,看看它是否会返回。我猜它不会从nextLine返回,除非您输入了一组字符(不管回车)

您可能可以使用流结束字符(我认为它是ctrl-d或ctrl-z)欺骗它从nextLine返回,但我相信这将关闭标准输入流,您将无法再次读取它

如果是我,我会根据自己的需求采取两种方法中的一种

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

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

类似这样的方法应该有效(没有仔细检查,但我认为这是正确的):

如果第一次尝试失败,您可以在第二次尝试时同样轻松地将文本更改为“该URL不起作用,请输入其他URL重试”


另外,如果url为null,则用户点击取消,因此退出。

隔离代码帮助我将问题从一大块代码缩小到一小块文本。Bill K关于修正while子句的建议使我将注意力集中在这一点上,并最终找到了答案。Jsoup URL连接器应该保留在try块中,否则程序将无法判断它是否有效。一旦被移动,它就开始完美地工作

如果其他人在尝试循环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);
    }

你在这里发布了很多代码。请把它简化为一个能说明问题的例子。(在这里避免询问另一个例外,做得很好——每个帖子一个问题:)谢谢你的反馈。我现在编辑代码以最小化它。我的问题只是解析方法,所以我意识到我现在可以删除其余的。好吧,这看起来很简单,但我认为可以进一步减少。如果您将所有内容都放在
main
方法中,完全取消Jsoup,只使用一个类,使用局部变量而不是静态变量,您仍然看到问题吗?你能准确描述你所看到的和你期望看到的吗?(这种诊断研究是软件工程师的重要组成部分——我希望整个过程都能帮助你学习。)你的正确命名是错误的。我会将它初始化为false(这是不正确的,是吗?),然后只有在他们输入了正确的URL之后,它才会变成“True”。那么它就是“正确的”。你的while子句变成while(!correct),它读作“whilenotcorrect”——这更容易阅读。不过,这不会改变您当前的行为,只会使其更易于阅读。可能是您在显示
PageScanner2
时调用
PageScanner
。如果不是这样的话,可能是因为它按应有的方式工作,而不是你所期望的方式工作吗?我认为您可能在这里错误地使用了继承。使用java GUI是一个好主意,我将看看是否可以在代码中实现它。我解决了问题;我需要在扫描程序输入之后立即使用Jsoup连接器,以便在它仍在循环中时检查其有效性,否则输入将始终被视为有效。
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());
}}
  String url = JOptionPane.showInputDialog(null, "Enter a URL to check");
/**
     * 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);
    }