将 Scanner nextLine 用于 String 时出现 InputMismatchException
InputMismatchException when using Sacnner nextLine for String
这是我的代码
import java.io.*;
import java.util.*;
class student
{
String name;
int age;
float cgpa;
}
public class getdata
{
public static void main(String args[]) throws IOException
{
Scanner in=new Scanner(System.in);
int n;
n=in.nextInt();
student[] s=new student[n];
for(int i=0;i<n;i++)
{
try
{
s[i]=new student();
s[i].name=in.nextLine();
in.nextLine();
s[i].age=in.nextInt();
s[i].cgpa=in.nextFloat();
}
catch(InputMismatchException e)
{
System.out.println(e.getMessage());
}
}
System.out.println();
System.out.println("Name\tAge\tCGPA\n");
for(int i=0;i<n;i++)
{
System.out.println(s[i].name+"\t"+s[i].age+"\t"+s[i].cgpa+"\n");
}
}
}
编译程序没问题。但是在执行时我尝试输入一个字符串 space ,它将字符串作为两个单独的字符串并将一个的所有其他值分配为空。例如,如果我输入
mike hannigan
5
6.5
输出为
mike 0 0.0
hannigan 5 6.5
我尝试仅使用一个 in.nextLine();
获取字符串,但这会导致该字符串被视为 null(抛出 InputMismatchException)。使用 try 和 catch 块
没有 try 块,这是我得到的输出
我的建议是始终将整行扫描为字符串,并使用解析方法将其转换为所需的数据类型。请看下面:
public static void main(String args[]) throws IOException
{
Scanner in=new Scanner(System.in);
int n;
n=Integer.parseInt(in.nextLine());
student[] s=new student[n];
for(int i=0;i<n;i++)
{
s[i]=new student();
s[i].name=in.nextLine();
s[i].age=Integer.parseInt(in.nextLine());
s[i].cgpa=Float.parseFloat(in.nextLine());
}
System.out.println();
System.out.println("Name\tAge\tCGPA\n");
for(int i=0;i<n;i++)
{
System.out.println(s[i].name+"\t"+s[i].age+"\t"+s[i].cgpa+"\n");
}
}
你的问题是理解中很常见的错误Scanner
。
调用 nextInt()
、nextFloat()
或大多数其他 nextXxx()
方法将不处理数字后面的换行符。
随后调用任何 nextXxx()
方法,除了 nextLine()
,将自动跳过该换行符,因为它是标记之间的空格。
但是,nextLine()
不会 跳过前导空格,因此在任何其他 nextXxx()
方法之后调用 nextLine()
,将 return 一个空字符串(或者更确切地说是最后一个标记之后的其余行中的任何内容)。
因此,当 mixing nextXxx()
调用与 nextLine()
调用时,您必须通过调用 nextLine()
第一。
这意味着您的代码应该是:
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine(); // Ignore rest of line after int
student[] s = new student[n];
for (int i = 0; i < n; i++) {
s[i] = new student();
s[i].name = in.nextLine();
s[i].age = in.nextInt();
s[i].cgpa = in.nextFloat();
in.nextLine(); // Ignore rest of line after float
}
System.out.println();
System.out.println("Name\tAge\tCGPA");
for (int i = 0; i < n; i++) {
System.out.println(s[i].name + "\t" + s[i].age + "\t" + s[i].cgpa);
}
更好的是,按照 所说:始终使用 nextLine()
并自己解析数字。
这是我的代码
import java.io.*;
import java.util.*;
class student
{
String name;
int age;
float cgpa;
}
public class getdata
{
public static void main(String args[]) throws IOException
{
Scanner in=new Scanner(System.in);
int n;
n=in.nextInt();
student[] s=new student[n];
for(int i=0;i<n;i++)
{
try
{
s[i]=new student();
s[i].name=in.nextLine();
in.nextLine();
s[i].age=in.nextInt();
s[i].cgpa=in.nextFloat();
}
catch(InputMismatchException e)
{
System.out.println(e.getMessage());
}
}
System.out.println();
System.out.println("Name\tAge\tCGPA\n");
for(int i=0;i<n;i++)
{
System.out.println(s[i].name+"\t"+s[i].age+"\t"+s[i].cgpa+"\n");
}
}
}
编译程序没问题。但是在执行时我尝试输入一个字符串 space ,它将字符串作为两个单独的字符串并将一个的所有其他值分配为空。例如,如果我输入
mike hannigan
5
6.5
输出为
mike 0 0.0
hannigan 5 6.5
我尝试仅使用一个 in.nextLine();
获取字符串,但这会导致该字符串被视为 null(抛出 InputMismatchException)。使用 try 和 catch 块
没有 try 块,这是我得到的输出
我的建议是始终将整行扫描为字符串,并使用解析方法将其转换为所需的数据类型。请看下面:
public static void main(String args[]) throws IOException
{
Scanner in=new Scanner(System.in);
int n;
n=Integer.parseInt(in.nextLine());
student[] s=new student[n];
for(int i=0;i<n;i++)
{
s[i]=new student();
s[i].name=in.nextLine();
s[i].age=Integer.parseInt(in.nextLine());
s[i].cgpa=Float.parseFloat(in.nextLine());
}
System.out.println();
System.out.println("Name\tAge\tCGPA\n");
for(int i=0;i<n;i++)
{
System.out.println(s[i].name+"\t"+s[i].age+"\t"+s[i].cgpa+"\n");
}
}
你的问题是理解中很常见的错误Scanner
。
调用 nextInt()
、nextFloat()
或大多数其他 nextXxx()
方法将不处理数字后面的换行符。
随后调用任何 nextXxx()
方法,除了 nextLine()
,将自动跳过该换行符,因为它是标记之间的空格。
但是,nextLine()
不会 跳过前导空格,因此在任何其他 nextXxx()
方法之后调用 nextLine()
,将 return 一个空字符串(或者更确切地说是最后一个标记之后的其余行中的任何内容)。
因此,当 mixing nextXxx()
调用与 nextLine()
调用时,您必须通过调用 nextLine()
第一。
这意味着您的代码应该是:
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine(); // Ignore rest of line after int
student[] s = new student[n];
for (int i = 0; i < n; i++) {
s[i] = new student();
s[i].name = in.nextLine();
s[i].age = in.nextInt();
s[i].cgpa = in.nextFloat();
in.nextLine(); // Ignore rest of line after float
}
System.out.println();
System.out.println("Name\tAge\tCGPA");
for (int i = 0; i < n; i++) {
System.out.println(s[i].name + "\t" + s[i].age + "\t" + s[i].cgpa);
}
更好的是,按照 nextLine()
并自己解析数字。