Java 扫描器没有字符输入会创建无限循环

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

我有一个奇怪的问题(或者至少对我来说很奇怪)。我有几个if-else-if语句,它们导致了奇怪的行为。对于上下文,我基本上使用
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()
仍在等待非分隔符字符。这是有意义的。不知道为什么一开始我没有想到。我还在课程的早期阶段,之前我还没有考虑过空白输入,但我想他们并不真正关心它是否能处理空白输入。从技术上讲,他们不在乎它是否处理了错误的输入,但我觉得它至少应该这样做。