Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从键盘获取字符串时的java.util.InputMismatchException 代码 输入_Java_Exception - Fatal编程技术网

从键盘获取字符串时的java.util.InputMismatchException 代码 输入

从键盘获取字符串时的java.util.InputMismatchException 代码 输入,java,exception,Java,Exception,--当提供HelloWorld作为输入时,上述代码可以正常工作,但当提供HelloWorld时,则无法正常工作 . 该方法不接受带空格的字符串。 < p>这里 Hello World < /COD> 下< /C> >将考虑 hello >代码>(仅)作为令牌, NeXDouth取 World < /Calp>(这导致异常< /代码>)作为输入,因为两者都用空格分隔。如果要在第二次输入中传递多个单词,请使用nextLine 因为next方法最多读取空间 您可以使用hasNextDouble、has

--当提供HelloWorld作为输入时,上述代码可以正常工作,但当提供HelloWorld时,则无法正常工作
. 该方法不接受带空格的字符串。

< 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());