2014-11-20 125 views
0

對於大學任務,從控制檯我需要能夠讀取多行,直到用戶輸入Ctrl + Z。我沒有問題,我的問題在於我無法從System.in中讀取任何內容,因爲它總是拋出NoSuchElementException異常。繼續在Java中的Ctrl + Z之後繼續閱讀控制檯輸入

以下是我用於閱讀多行的代碼,它由教師提供,因此我不想更改它。

System.out.println("To terminate input, type the correct end-of-file indicator "); 
System.out.println("when you are prompted to enter input."); 
System.out.println("On UNIX/Linux/Mac OS X type <ctrl> d"); 
System.out.println("On Windows type <ctrl> z"); 

Scanner input = new Scanner(System.in); 

while (input.hasNext()) { 
    //Processes input 
    addFileIntoDirectory(input.nextLine()); 
} 

據我所知,這是由Ctrl + Z等同於EOF標記引起的,但我不知道如何移過它。無論我在做多少次讀取之後,無論是否向控制檯輸入了更多內容,我都會立即返回另一個NoSuchElementException。

我已經嘗試過有一個單獨的掃描儀菜單,關閉上面的掃描儀並打開一個新的菜單,但都不起作用。

有沒有辦法刷新/清除System.in或重置它?

請讓我知道,如果你想了解更多的細節。因爲這是作業,所以我保留了程序的其餘部分。

編輯1:作業說「系統提供瞭如下文本選擇菜單,並且 運行循環。」這意味着程序不會在Ctrl + Z上終止。

  1. 從用戶輸入添加文件
  2. 顯示整個目錄
  3. 顯示目錄的大小
  4. 出口 請給一個選擇[0-4]:
+0

文件結尾是文件結束句點。該流已結束。這是一個外流。不過,我想也許你錯誤地解釋了你的任務。你還沒有寫出完全是什麼。但我在想,如果你應該有一個菜單,然後一系列的輸入,然後回到菜單 - 那麼'eof'應該是**程序**的結尾,而不是結束投入。 – RealSkeptic 2014-11-20 17:42:54

+0

@RealSkeptic這就是我所希望的,但菜單有一個「退出」選項,所以我被引導認爲情況並非如此。 – FreakyDan 2014-11-20 18:18:54

+0

儘管如此,請在您的問題中寫下作業的完整文字和確切文字。如果我們不知道實際需求,那麼解釋有很多種可能性...... – RealSkeptic 2014-11-20 18:20:49

回答

3

簡短的回答是:

if (!input.hasNext()) 
    input = new Scanner(System.in); 

長的答案是:

下面的代碼,以供以後去除提出的意見,按我的理解和解決方案來說明問題。

請注意,此演示僅適用於工作整數和^Z輸入。

將代碼複製並保存到文件HN.java進行編譯。

運行該程序,它會提示一個。通過輸入^Z輸入整數到你的心臟的內容並退出循環。

將在問題中顯示兩個,然後顯示NoSuchElementFound exception。這是因爲掃描器對象input中的^Z仍爲,因此在方法nextInt()上失敗。

第一個傾向可能是使用hasNext()來解釋這一點。因此,請繼續取消註釋/*Comment1並重新編譯並再次運行。

現在,您可以避免這種例外情況,但程序會一直到最後,跳過原本打算的nextInt()

因此,現在取消/*Comment2,重新編譯並重新運行。現在程序將按照預期等待兩個提示。如果你在這裏輸入一個整數,你將進入三個提示輸入另一個條目。

但是,如果您輸入^Z兩個,程序將跳過下一個輸入。要解決這個問題,請取消註釋/*Comment3,重新編譯並運行,您將看到該程序適用於所有整數組合,以及各種輸入的^Z

現在,您可能想知道爲什麼我沒有在/*Comment3中重複使用!input.hasNext()解決方案。這裏有一個演示爲什麼:

放回/*Comment3並取消註釋/*Comment4,編譯並再次運行。該程序工作正常,在處輸入輸入兩個提示符,但是如果你在那裏輸入一個整數,你會看到系統在等待輸入,但是沒有提示三個

這是因爲您輸入的整數用於前面的nextInt(),所以當程序到達hasNext()時,它停止並等待輸入。

這裏的教訓是,你使用!input.hasNext()當你知道你在隊列一個^Z當它被用來逃避這個節目while循環和樓主的問題,如。否則,其他結構更適合。

hasNext()令人困惑的工作。你必須記住,如果排隊中沒有任何內容,程序將停止並等待輸入。如果你不小心,這可能會搞砸你的提示。

import java.util.Scanner; 

public class HN 
{ 
    public static void main(String args[]) 
    { 
     Scanner input = new Scanner(System.in); 
     int temp = 0; 

     System.out.println("One"); 

     while (input.hasNext()) 
     { 
      temp = input.nextInt(); 
     } 

     System.out.println("Two"); 

     /*Comment2 
     if(!input.hasNext()) input = new Scanner(System.in); 
     Comment2*/ 

     /*Comment1 
     if (input.hasNext()) 
     Comment1*/ 

     { 
      temp = input.nextInt(); 
      System.out.printf("%d\n", temp); 
     } 

     /*Comment3 
     else input = new Scanner(System.in); 
     Comment3*/ 

     /*Comment4 
     if(!input.hasNext()) input = new Scanner(System.in); 
     Comment4*/ 

     System.out.println("Three"); 

     if (input.hasNext()) 
     { 
      temp = input.nextInt(); 
      System.out.printf("%d\n", temp); 
     } 

     System.out.println("Four"); 
    } 
} 
+2

這是一個非常糟糕的答案...添加幾個字和一些格式。 – t3chb0t 2015-01-30 06:17:35

+0

按照要求詳細說明: – Matt 2015-02-06 00:54:17

+0

上面這行可以用來「掃除」Scanner對象中的^ Z「輸入」。在下一次閱讀之前插入該行。但是,請注意,如果根本沒有數據,掃描儀對象「輸入」將在此行暫停執行並等待輸入。 – Matt 2015-02-06 01:01:17