2017-03-31 64 views
1

當我試圖運行它並檢查錯誤時,我注意到在我的一個方法中允許在非法輸入後重新嘗試的do-while循環不起作用當該方法被調用時。在do-while循環中使用JSoup,仍然拋出異常

我的問題是: 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()); 
}} 

免責聲明:我對編程相當陌生,如果答案很明顯,或者發佈的代碼太多,我很抱歉。如有必要,我可以編輯和刪除代碼。

+3

你在這裏發表* *很多的代碼。請將其降低到[只能*顯示問題的[mcve])。 (做好避免問這裏的其他例外 - 每個職位一個問題:) –

+0

感謝您的反饋意見。我編輯了代碼以最小化它。我的問題只是解析方法,所以我意識到我現在可以刪除其餘的。 – ary

+1

好吧,這看起來很多*更*最小 - 但我認爲它可以進一步減少。如果你把所有東西都放到你的'main'方法中,那麼完全拋棄Jsoup,只有一個類,使用局部變量而不是靜態變量,你是否仍然看到問題?你能描述一下你看到的和你期望看到的內容嗎? (這種診斷研究是成爲軟件工程師的重要組成部分 - 我希望整個過程能夠幫助您學習。) –

回答

1

隔離代碼幫助我將我的問題從一大塊代碼縮小到一小塊文本。比爾K的關於修正我的時間條款的建議使我將注意力集中到這個問題上並最終導致了答案。 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); 
    } 
1

雖然我不確定這是否是您的問題,但掃描儀可能很難合作,如果可能,我會盡量避免。它可能沒有傳遞給你,直到緩衝區滿了。你可以嘗試輸入大量的文本,看看它是否有迴應(我相信這是Windows的行爲,不是真正的Java,它可能在Linux上表現不同)。另一個測試可能是將System.out.println放在nextLine之後,看看它是否返回。我的猜測是,直到你輸入了一堆字符(不管回車),它纔會從nextLine返回。

你可能會欺騙它從nextLine結束流字符(我認爲它是ctrl-d或ctrl-z),但我相信這將關閉你的標準輸入流,你將無法再次閱讀。

如果是我,我會根據我的要求採取兩種方法中的一種。

一種方法是將其作爲一次性程序運行。把你想要的文本放在命令行上,並從main()參數中讀入。如果您無法連接打印錯誤並退出 - 用戶可以通過點擊向上箭頭並編輯最後一行來重新提交。一旦這個工作,你可以編寫一個.cmd(或bash)批處理文件來啓動你的Java應用程序,這樣你就不必每次都輸入那個尷尬的命令行。

第二個是使用Java輸入框GUI之一。他們歸結爲幾行代碼,給你一個彈出式對話框,你的用戶可以輸入他的文本。

像這樣的東西應該工作(沒有仔細檢查,但我認爲這是正確的):

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

如果第一次嘗試失敗,你可以很容易地將文字更改爲類似「這個URL做沒有工作,請輸入不同的網址重試「第二次嘗試。

此外,如果url爲空,用戶點擊取消,所以退出。

+0

使用java GUI是一個好主意,我會看看我是否可以將它實現到我的代碼中。我想出了這個問題;我需要在掃描器輸入後立即使用Jsoup連接器,以便在仍處於循環中時檢查其有效性,否則輸入始終被視爲有效。 – ary