从键盘获取字符串中的java.util.InputMismatchException

时间:2014-06-25 10:11:22

标签: java exception

CODE

package info.code;

import java.util.Scanner;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class GetDataFromKeyBoardAndStoreInDB {

public static void main(String[] args) {

  Scanner s = new Scanner(System.in);

  Product p = new Product();
  p.setPid(s.nextInt());
  p.setName(s.next());
  p.setPrice(s.nextDouble());

  Configuration cfg = new Configuration(); 
  cfg.configure();
  SessionFactory sf = cfg.buildSessionFactory();
  Session hsession = sf.openSession();
  hsession.beginTransaction();

  hsession.save(p);

  hsession.getTransaction().commit();
  hsession.close();
  sf.close();
}

}

INPUT

115
Hello World
Exception in thread "main" java.util.InputMismatchException
        at java.util.Scanner.throwFor(Scanner.java:840)
    at java.util.Scanner.next(Scanner.java:1461)
    at java.util.Scanner.nextDouble(Scanner.java:2387)
    at info.code.GetDataFromKeyBoardAndStoreInDB.main(GetDataFromKeyBoardAndStoreInDB.java:18)

- 上面的代码在提供HelloWorld作为输入时工作正常,但在提供的Hello World时却没有 。此方法是否不接受带空格的String。

4 个答案:

答案 0 :(得分:1)

此处Hello World next会将Hello)视为令牌,而nextDoubleWorld视为Exception这会导致 nextLine)作为输入,因为两者都由空格分隔。如果要在第二个输入中传递多个单词,请使用next

因为hasNextDouble方法读取空格。

您可以使用hasNextInthasNexttry-catch方法检查代码并使用nextInt()覆盖您的代码。


当您混淆nextLine()nextInt时, newLine 字符会出现问题Product p = new Product(); p.setPid(s.nextInt()); s.nextLine();//to remove newLine character inconvinience Skip Line p.setName(s.nextLine()); p.setPrice(s.nextDouble()); 无法读取。

所以我建议你这样做。

{{1}}

答案 1 :(得分:1)

Scanner使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格,如果下一个标记与InputMismatchException / {{1}不匹配,则抛出Integer } / String / ...正则表达式(取决于您调用的方法),或超出范围。这就是为什么在使用Double空格时抛出此异常的原因(第三个标记的类型为Hello World而不是String)。

答案 2 :(得分:1)

您正在使用s.next()来读取其中Hello worldHello由空格分隔的输入World,这意味着s.next()将读取Hello {1}}令牌,因此World令牌转到s.nextDouble(World),这会产生异常。

使用s.nextLine()进行阅读Hello World

答案 3 :(得分:0)

代码

  Scanner s = new Scanner(System.in);

  Product p = new Product();
  p.setPid(s.nextInt());
  p.setName(s.next().concat(s.nextLine()));
  p.setPrice(s.nextDouble());

输入

333

Hello World Am Fine //我们可以在这里拥有任意数量的String标记(但不应超过DB中声明的限制)

6000

log4j:WARN找不到logger(org.hibernate.cfg.Environment)的appender。 log4j:WARN请正确初始化log4j系统。

Hibernate:插入HIB.PRODUCT(NAME,PRICE,PID)值(?,?,?)

输出

PID名称价格

333 Hello World Am Fine 6000

CASE - 1

如果我们的代码是

  p.setPid(s.nextInt());
  p.setName(s.nextLine());
  p.setPrice(s.nextDouble());
那么,如果我们供应' Hello World'作为setName()参数的输入; ,它只需要' World'作为输入因为扫描程序超过当前行并返回跳过的输入。此方法(readLine())返回当前行的其余部分,不包括末尾的任何行分隔符。

因此对于相同的输入(如上所述),输出将是

PID名称价格

333 World 6000

CASE - 2(问题的解决方案)

如果我们的代码是

          p.setPid(s.nextInt());
          p.setName(s.next().concat(s.nextLine());
          p.setPrice(s.nextDouble());

然后我们得到预期的输出。首先,我们使用s.next()获取String;方法,然后我们连接跳过的字符串(跳过s.next());通过使用nextLine()读取跳过的String,对我们的旧String使用concat()方法;方法

结论

对于readLine();方法

扫描程序经过当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。