当我尝试运行它并检查错误时,我注意到我的一个方法中的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());
}}
免责声明:我对编程很新,如果答案很明显,或者我发布了太多代码,我会道歉。如有必要,我可以编辑和删除代码。
答案 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);
}