2016-10-24 41 views
1

我想弄清楚为什么我的while循环给我留下了一个无限循环,即使逻辑上来说,我也没有办法进步,对我来说它似乎应该起作用。继承人问题代码:为什么Java在代码创建无限循环时执行此操作?

public void enterData(){ 
     System.out.println("Polish Notation Calculator"); 
    do{ 
     System.out.print("Please enter an operation: "); 
     oper = input.next().charAt(0); 
    }while (oper != '+' || oper != '*' || oper != '/' || oper != '-' || oper != '%'); 
     System.out.print("First number: "); 
     x = input.nextDouble(); 
     System.out.print("Second number: "); 
     y = input.nextDouble(); 

从我可以告诉,这一切的环说是做的打印和扫描功能,而OPER不等于在引号的内容。为什么这不起作用?

+0

while循环布尔条件始终为真。 –

+3

想一想。也许你想用'&&'操作符;) –

+0

你要求用户输入一个操作,只检查他们是否没有输入操作... –

回答

3

因为你的情况总是如此。替换||与& &。

或者你可以重写是:

while (!(oper == '+' || oper == '*' || oper == '/' || oper == '-' || oper == '%')) 

这在逻辑上等同于:

while (oper != '+' && oper != '*' && oper != '/' && oper != '-' && oper != '%') 

换句话说:

NOT(A = X || A = Y) 

是一样的:

A != X && B != Y 

或者你使用KISS原则:

while (true) { 
    System.out.print("Please enter an operation: "); 
    oper = input.next().charAt(0); 

    if ("+*/-%".indexOf(oper) != -1) { 
     break; 
    } 
} 

或者你用decomposition

do { 
    System.out.print("Please enter an operation: "); 
    oper = input.next().charAt(0); 
} while (!isValidOperation(oper)); 

... 

public boolean isValidOperation(char oper) { 
    return oper == '+' || oper == '*' || oper == '/' || oper == '-' || oper == '%'; 
} 
1

更换

while (oper != '+' || oper != '*' || oper != '/' || oper != '-' || oper != '%'); 

while (oper != '+' && oper != '*' && oper != '/' && oper != '-' && oper != '%'); 

目前,你的情况总是如此。

0

对于循环退出,操作者输入在线路

oper = input.next().charAt(0); 

必须比'+', '-', '*', '/''%'不同。如果输入了这些字符中的任何一个,循环将会重复。显然,这就是你正在做的。

因此,一个明显的解决方案是用&&替换while子句的||子句。

另一种解决方案是使用switch声明,这是一个比较可读(快):

boolean loop = true; 
do { 
    System.out.print("Please enter an operation: "); 
    oper = input.next().charAt(0); 
    switch (oper) { 
    case '+': 
    case '-': 
    case '*': 
    case '/': 
    case '%': 
     loop = false; 
     break; 
} while (loop); 
+0

我不认为加快会有所帮助。用户输入的延迟将远远超过检查5个字符的延迟。 – 4castle

+0

当然,但它也更具可读性。:-) – PNS

+0

是什么让你相信5路'switch'比5路相等检查更快? – Andreas

相关问题