2015-02-10 103 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