我希望避免在输入nextInt()的数字时按Enter键所产生的"新行字符"的问题,因为nextLine()将消耗新行字符,不让我输入字符串.

我使用了一个定制的分隔符来避免这个问题,这样nextInt()也可以使用行尾字符

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
    sc.useDelimiter("\\n");
    System.out.println("Enter your age");
    int age=sc.nextInt();
    System.out.println("Enter your name");
    String name=sc.nextLine();
    System.out.println("Age is "+ age);
    System.out.println("Name is "+ name);
    }
}

但是,当我运行此程序时,我收到以下错误:

Enter your age
4
Exception in thread "main" java.util.InputMismatchException
        at java.base/java.util.Scanner.throwFor(Scanner.java:939)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at Test.main(Test.java:8)

我不明白为什么我会收到InputMismatchException. 有人能解释一下这个分隔符是如何工作的吗?

正如@abra在 comments 中指出的那样,如果我使用next()而不是nextLine(),它会按预期工作.问题是,为什么nextLine()不起作用?

推荐答案

抛出InputMismatchException是因为您为您的操作系统使用了错误的行分隔符.nextInt读取下一个令牌(即在分隔符之前停止).因为您已经输入了4\r\n,所以下一个令牌是4\r,这不是一个有效的int.

首先,为您的操作系统使用正确的行分隔符.一种独立于平台的方式可以做到这一点:

sc.useDelimiter(Pattern.quote(System.lineSeparator()));

现在 scanner 正确地读取int,但nextLine仍然读取空字符串.

这是因为与nextnextInt等不同,nextLine不关心分隔符.它看到它前面的\r\n,并确定这是当前行的末尾,并返回之前的所有内容.

nextLine:

使该 scanner 前进到当前行,并返回跳过的输入.此方法返回当前行的其余部分,不包括末尾的任何行分隔符.该位置被设置为下一行的开始(在本例中,没有任何内容).

next: 查找并返回此 scanner 中的下一个完整令牌.完整的令牌前面和后面都是与分隔符模式匹配的输入.

另请参阅课程文档中的散文:

Next()和hasNext()方法及其配套方法(如nextInt()和hasNextInt())首先跳过与分隔符模式匹配的任何输入,然后try 返回下一个标记.

在读取int之后,剩余的输入将是\r\nJohn Doe\r\n,John Doe的前面和后面都是分隔符--这与"完整令牌"的含义完全匹配,所以您可以用next()来读取它.

Java相关问答推荐

Jooq隐式地将bigint转换为数字,并且索引不起作用

CriteriaQuery with max

Spring boot:Bean和动态扩展器

给定Java枚举类,通过值查找枚举

只需最少的代码更改即可将版本号标记添加到日志(log)

Spark忽略Iceberg Nessie目录

使用GridBagLayout正确渲染

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

Java Telnet客户端重复的IAC符号

使用While循环打印素数,无法正常工作

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

Android Studio模拟器没有互联网

JavaFX标签中的奇怪字符

在线程Java中调用Interrupt()之后调用Join()

如何在Java中的重写方法参数中强制(Enum)接口实现?

Bash数组的单引号元素并使用空格连接

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

无泄漏函数的Java DRY

转换为JSON字符串时,日期按天递减-Java