从键盘获取字符串时的java.util.InputMismatchException 代码 输入
--当提供HelloWorld作为输入时,上述代码可以正常工作,但当提供HelloWorld时,则无法正常工作从键盘获取字符串时的java.util.InputMismatchException 代码 输入,java,exception,Java,Exception,--当提供HelloWorld作为输入时,上述代码可以正常工作,但当提供HelloWorld时,则无法正常工作 . 该方法不接受带空格的字符串。 < p>这里 Hello World < /COD> 下< /C> >将考虑 hello >代码>(仅)作为令牌, NeXDouth取 World < /Calp>(这导致异常< /代码>)作为输入,因为两者都用空格分隔。如果要在第二次输入中传递多个单词,请使用nextLine 因为next方法最多读取空间 您可以使用hasNextDouble、has
. 该方法不接受带空格的字符串。 < p>这里<代码> Hello World < /COD> <代码>下< /C> >将考虑<代码> hello >代码>(仅)作为令牌,<代码> NeXDouth取<代码> World < /Calp>(这导致<代码>异常< /代码>)作为输入,因为两者都用空格分隔。如果要在第二次输入中传递多个单词,请使用
nextLine
因为next
方法最多读取空间
您可以使用hasNextDouble
、hasNextInt
或hasNext
方法检查代码,或使用try catch
环绕代码
当您将
nextInt()
和nextLine()
混合在一起时,nextInt
未读取的换行符将出现问题
所以我建议你这样做
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)
Scanner
使用分隔符模式将其输入拆分为标记,默认情况下,分隔符模式与空格匹配,如果下一个标记与整数
/字符串
/双精度
/。。。正则表达式(取决于调用的方法),或超出范围。这就是为什么在将空格与Hello World
一起使用时会引发此异常的原因(第三个标记的类型是String
而不是double
)。使用s.next()读取输入,Hello World
,其中Hello
和World
用空格分隔,这意味着s.next()
将读取Hello
令牌,而World
令牌因此转到s.nextDouble(World)
,这将产生异常
使用s.nextLine()
阅读,Hello World
code
输入
333
Hello World Am Fine//这里可以有任意数量的字符串标记(但不应超过DB中声明的限制)
六千
log4j:WARN找不到记录器(org.hibernate.cfg.Environment)的追加器。
log4j:警告请正确初始化log4j系统
Hibernate:插入HIB.PRODUCT(名称、价格、PID)值(?、、?)
输出
PID名称价格
333你好,我很好,6000
案例1
如果我们的代码是
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());
然后,如果我们提供“Hello World”作为setName()的参数输入,它只接受“World”作为输入,因为扫描仪经过当前行并返回跳过的输入。此方法(readLine())返回当前行的其余部分,不包括末尾的任何行分隔符
因此,对于相同的输入(如上所述),输出将
PID名称价格
333世界6000
案例2(问题的解决方案)
如果我们的代码是
p.setPid(s.nextInt());
p.setName(s.nextLine());
p.setPrice(s.nextDouble());
然后我们得到预期的输出。首先,我们使用s.next()获取字符串;方法,然后对跳过的字符串进行concat(由s.next()跳过);通过使用nextLine()读取跳过的字符串,将concat()方法用于我们的旧字符串;方法
结论
对于readLine();方法
扫描仪通过当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。因此,当使用Scanner时,我们不能提供一个中间有空格的字符串吗?nextInt()不读取下一个
\n
字符,请以1 hello world\n 2.3
的形式提供输入,这是用空格而不是字符分隔的int和String输入。或者在s.nextLine()
之后插入一个s.nextLine()
,就像任务所说的,现在它可以工作了。
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());
p.setPid(s.nextInt());
p.setName(s.nextLine());
p.setPrice(s.nextDouble());
p.setPid(s.nextInt());
p.setName(s.next().concat(s.nextLine());
p.setPrice(s.nextDouble());