如果收到错误的字符,Java Scanner会停止读取输入

时间:2015-10-14 20:55:01

标签: java input output

我正在制作反向波兰表示法程序,并且我遇到了处理无效表达式的问题......如果操作员或操作数太少,我可以处理它,但我可以& #39; t处理任何不是"("," +"," - "," * "和"#"。

基本上我想知道一种跳过行的其余部分的方法(或强制将一个英镑符号强制输入)而不是读取整个表达式。

以下是我的代码:

public class RpnEvaluator
{
   private Scanner stdin;
   private Stack stack = new Stack(50);
   private Queue queue = new Queue(50);
   private String expression = "";
   private String interValue = "";
   private int numExpressions = 0;

   /**
   Runs the RPN Evaluator.
   */
   public void run()
   {  
      stdin = new Scanner(System.in);
      while( stdin.hasNext() )
      {
         String input = stdin.next();
         if( input.charAt(0) == '(' )
            addOperand(input);
         else if( input.equals("+") || input.equals("-") || input.equals("*") )
            performOperation(input.charAt(0));
         else if( input.equals("#") )
            outputExpression();
         else
            invalidExpression(); **// Here is where I need to deal with anything that isn't above and output anything BEFORE the bad value, AND the value itself.**

      }
      System.out.println("Normal Termination of Program 3.");
   }

例如:输入,例如

(2/9) B (4/3) / # 

应该返回此输出:

Expression 1 is: (2/9)B
Invalid Expression
Intermediate results:

2 个答案:

答案 0 :(得分:0)

在查看笔记之后,我找到了一个部分,我们首先介绍了反向波兰表示法,我们实际上讨论了处理可能的错误,从这些说明中,我创建了这两种似乎完美无缺的方法。

private void skipExpression()
{
   while( stdin.hasNext() )
    {
      input = stdin.next();
      if( input.equals("#") )
         break;
   }
}

private void invalidExpression()
{
   skipExpression();
   numExpressions++;
   System.out.println("Expression " + numExpressions + " is: " + expression);
   System.out.println("Invalid Expression");
   System.out.println("Intermediate results: " + interValue);
   expression = "";
   interValue = "";
   stack.clear();
   queue.clear();
}

答案 1 :(得分:0)

如果下面的标记对[0-9+/*\-#]这样的模式有效,或者还有一个特定于上下文的模式,我会首先使用hasNext(模式模式)进行测试,如果不是,我会跳过(模式模式)模式匹配每个字符但回车,.

相关问题