2016-07-12 117 views
0

时,这是我的代码InputMismatchException时使用Sacnner 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"); 
     } 
    } 
} 

编译程序没有给出问题。但是当执行时,我尝试输入一个字符串空间,它将字符串作为两个单独的字符串,并将其中一个的所有其他值指定为null。为例如,如果我输入

mike hannigan 
5 
6.5 

输出是

mike 0 0.0 
hannigan 5 6.5 

我试图获得仅具有单个in.nextLine();的字符串,但导致要采取的字符串作为空(抛出InputMismatchException时)。用try和catch块

with try block

并没有try块,这是输出我得到

enter image description here

+0

这是因为'nextInt'和'nextFloat'不会消耗换行符,所以后续的'nextLine'不会捕获您期望的结果。我确定有一个重复的地方解释了这个... – 4castle

回答

2

我的建议是始终扫描整个行字符串,并将其转换为所需的数据类型使用解析方法。请看下面:

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"); 
    } 
} 
0

你的问题是在理解Scanner很常见的错误。

调用nextInt()nextFloat()或大多数其他nextXxx()方法将在未处理的数字后面留下换行符。

到任何的nextXxx()方法的后续调用,以外nextLine(),会自动跳过换行符,作为标记之间的空白。

然而,nextLine()确实跳过前导空白,任何其他nextXxx()方法后,因此调用nextLine(),会返回一个空字符串(或者更确切地说,无论是上线的最后一个令牌之后的其余部分)。

所以,当混合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); 
} 

更重要的是,不要将answer by @JaganathanNanthakumar说的话:一定要使用nextLine()和自己分析的数量。

+0

这是非常常见的,所以实际上有一个规范的答案(我链接) – 4castle

+0

@ 4castle你说得对,我忘了它是什么。 – Andreas

+0

当然没有任何反应的答案。为OP提供具体的解决方案以获得想法是很好的。 – 4castle