Java 在do while循环中使用JSoup,仍然引发异常
当我尝试运行它并检查错误时,我注意到我的一个方法中的do while循环在调用该方法时不起作用,该循环允许在非法输入后重试 我的问题是: 1) 为什么PageScanner()方法中的do while循环不起作用? 2) 你能建议一个更好的方法来组织我的代码吗 这就是它目前的样子: 第一堂课:“BulkSpellChecker”(我试图组织代码的地方) 第二类“ParseCleanCheck”(所有丑陋的事情都发生在这里)Java 在do while循环中使用JSoup,仍然引发异常,java,loops,inheritance,jsoup,Java,Loops,Inheritance,Jsoup,当我尝试运行它并检查错误时,我注意到我的一个方法中的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);
}