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();
}
}
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。
答案 0 :(得分:1)
此处Hello World
next
会将Hello
(仅)视为令牌,而nextDouble
将World
视为Exception
(这会导致 nextLine
)作为输入,因为两者都由空格分隔。如果要在第二个输入中传递多个单词,请使用next
。
因为hasNextDouble
方法读取空格。
您可以使用hasNextInt
,hasNext
或try-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 world
和Hello
由空格分隔的输入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
如果我们的代码是
p.setPid(s.nextInt());
p.setName(s.nextLine());
p.setPrice(s.nextDouble());
那么,如果我们供应' Hello World'作为setName()参数的输入; ,它只需要' World'作为输入因为扫描程序超过当前行并返回跳过的输入。此方法(readLine())返回当前行的其余部分,不包括末尾的任何行分隔符。
因此对于相同的输入(如上所述),输出将是
PID名称价格
333 World 6000
如果我们的代码是
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();方法
扫描程序经过当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。