2015-02-10 100 views
0

我正在爲後綴表達式計算器使用掃描儀,並遇到輕微問題。當我通過命令行輸入表達式時,表達式不會終止並達到無限循環。使用print語句和jdb,我能夠推斷出我希望的命令都能正常執行並正確評估,但是我無法弄清楚爲什麼掃描程序不會終止(因此將它留在無限的while循環中)。我知道掃描儀必須吃掉輸入信息,而不是僅僅確定它是否被留下,它應該在做什麼(我相信)。當我將我的掃描儀作爲我希望評估的表達式輸入而不是System.in(用於命令行輸入)時,所有事情都會根據需要終止,這就是爲什麼我非常困惑。有沒有人遇到過這個問題?我會在下面發佈一些簡潔的代碼片斷,取自未能終止的主體。Postfix評估器 - 掃描儀問題?

Scanner i = new Scanner(System.in); 
System.out.println("Message..."); 
StackList stack = new StackLinkedList(); 
while (i.hasNext()) { 
    if (input.hasNextInt()) { 
     stack.push(i.nextInt()); 
     continue; 
    } 
    String op = input.next()); 
    Integer val_one = stack.pop(); 
    Integer val_two = stack.pop(); 
    switch(op) { a switch statement that evaluates based on the operator}; 
} 
input.close(); 
System.out.println(stack.pop); 

注:我已經檢查過以前的實現,並且我找不到我的不同之處。大多數遇到這些類型問題的人都不會隨意使用輸入,我相信我的代碼應該這樣做。我輸入的表達式如1 2 +'Enter'(答案應該是3,當我將掃描器設置爲字符串1 2 +時,確實出現了3),但是當輸入是通過命令行時,它們不會終止。

回答

1

從控制檯讀取的掃描儀將始終有更多的數據,因爲總是有可能會輸入更多。

你可以按按Ctrl-d輸入(在Linux上)或按Ctrl-Z輸入(在Windows上),它模擬控制檯上的條件「文件結束」(因爲如果你是從文件中讀取或字符串和到它的結尾)。

但是,也許你想從控制檯一次讀取一行,然後分別解析每行? (與Scanner構造函數,需要String這是你讀的行)

+0

我欣賞的反饋;我發現大多數人都是通過單行閱讀來獲得投入,但實際上並沒有意識到這一點至關重要。我會改變,看看會發生什麼。所以這裏是攻擊計劃:我可以使用nextLine命令而不是next和nextInt將輸入讀入字符串中,然後解析字符串?你在說什麼? – Eric 2015-02-10 06:27:09

+0

也,我需要做ctrl-d輸入嗎?我們的任務沒有提到任何關於這個,我覺得她會解釋(但是,我只知道C和Cpp,因爲我跳過這個類的Intro Java,這是一種預先搜索) – Eric 2015-02-10 06:40:11

+0

@Eric Ctrl-D行爲和文件末尾一樣 - 所以'hasNext'返回false - 並且它不是特定於Java的。可能您的任務期望您一次處理一行,或者可能期望您對某個字符串進行硬編碼。如果你不清楚,就問問某人 - 這個問題與作業沒有直接關係,所以並不要求他們爲你做你的工作。 – immibis 2015-02-10 06:44:52