Java 扫描器没有字符输入会创建无限循环
我有一个奇怪的问题(或者至少对我来说很奇怪)。我有几个if-else-if语句,它们导致了奇怪的行为。对于上下文,我基本上使用Java 扫描器没有字符输入会创建无限循环,java,if-statement,java.util.scanner,Java,If Statement,Java.util.scanner,我有一个奇怪的问题(或者至少对我来说很奇怪)。我有几个if-else-if语句,它们导致了奇怪的行为。对于上下文,我基本上使用Scanner类和Scanner.nextInt().charAt(0)获取char输入。如果我检查所需的字符并输入一个完全随机的字符(它将文本返回到终端、断开并退出),那么这似乎工作正常。但是,如果我只是在char提示符下按enter键,它会创建一个无限循环(可能是内存泄漏?)。附件是我正在编写的代码,以及在Coderunner2中运行的截图 提前谢谢 import j
Scanner
类和Scanner.nextInt().charAt(0)
获取char
输入。如果我检查所需的字符并输入一个完全随机的字符(它将文本返回到终端、断开并退出),那么这似乎工作正常。但是,如果我只是在char
提示符下按enter键,它会创建一个无限循环(可能是内存泄漏?)。附件是我正在编写的代码,以及在Coderunner2中运行的截图
提前谢谢
import java.util.*;
import java.io.*;
public class phonebill
{
public static void main(String[] arg)
{
Scanner sc = new Scanner(System.in);
System.out.print("Please input the account number: ");
int acct = sc.nextInt(); // reads arbitrary account number
System.out.print("Please input service code: ");
char svc_code = sc.next().charAt(0); // reads service code
character
/* the following blocks check for the appropriate service codes.
* valid codes include p or P for 'Premium' service, and
* r or R for regular service. if no valid code is read,
* the program exits, informing the user to input a valid code.
*/
if (svc_code == 'p' || svc_code == 'P')
{
System.out.print("Please input daytime minutes: ");
int day_min = sc.nextInt();
System.out.print("Please input nighttime minutes: ");
int night_min = sc.nextInt();
System.out.println("Service code is " + svc_code + " and this condition works.");
}
else if (svc_code == 'r' || svc_code == 'R')
{
System.out.print("Please input used minutes: ");
int mins = sc.nextInt();
System.out.println("Service code is " + svc_code + " and this condition works.");
}
else
{
System.out.println("Please input a valid service code.");
}
System.out.print("That's all for now folks");
}
}
更新:我只是不擅长Java和扫描器 这不是无限循环,也不是内存泄漏 它只是等待您输入一个非空字符串
$ java phonebill
Please input the account number: 123
Please input service code:
string
Please input a valid service code.
That's all for now folks
(空白行是我刚刚按下enter键的地方。我最终键入了“string”,它就停止了)。准确地说,是一个标记。我明白了。我甚至没想过。我环顾了一下
char
数据类型,发现它被认为是原始的,这就是为什么扫描仪中没有nextChar()
函数的原因。我还不习惯java的工作方式,尽管我相信大多数其他语言都是这样工作的。我想没有办法说“如果(“”)然后关闭扫描仪”之类的话,对吧?我应该假设有输入?@parsec如果您想处理可能为空的字符串,请使用sc.nextLine()
。您可以使用String.startsWith
检查潜在的空字符串是否以字符开头。太棒了,谢谢!我会调查的。可能值得做的只是避免将来发生任何类似这样的可能奇怪的事情,或者避免在他们可能拥有的任何自动测试中扮演奇怪的角色。这是next()
和nextLine()
之间的区别之一。默认情况下,next()
不能接受空行作为输入,因为默认分隔符是一个或多个包含行分隔符的空白。由于next()
返回标记(由分隔符分隔的字符串),而您只提供分隔符(由键盘上的Enter键生成的行分隔符),next()
仍在等待非分隔符字符。这是有意义的。不知道为什么一开始我没有想到。我还在课程的早期阶段,之前我还没有考虑过空白输入,但我想他们并不真正关心它是否能处理空白输入。从技术上讲,他们不在乎它是否处理了错误的输入,但我觉得它至少应该这样做。