Scanner sc = new Scanner(System.in);
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
conn = UitlJDBC2.conti();
System.out.println("输入转账人的姓名");
String fromname = sc.nextLine();
System.out.println("输入转账金额");
int money = sc.nextInt();
System.out.println("输入收款人的姓名"); //当跟上面的金额输入调换顺序时候就会失败
String toname = sc.nextLine();
try {
conn.setAutoCommit(false);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
ps1 = conn.prepareStatement("update bank_account set amoney=amoney-? where aname=?");
ps1.setInt(1, money);
ps1.setString(2, fromname);
ps2 = conn.prepareStatement("update bank_account set amoney=amoney+? where aname=?");
ps2.setInt(1, money);
ps2.setString(2, toname);
if (ps1.executeUpdate()==1 && ps2.executeUpdate() == 1) {
conn.commit();
System.out.println("转账成功");
} else {
conn.rollback();
System.out.println("转账失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
UitlJDBC2.closeall(conn, ps1, null);
UitlJDBC2.closeall(conn, ps2, null);
sc.close();
}
}
初学java ,一个简单的jdbc 事务案例 , 但运行顺序突然懵了 因为输入money时候会直接执行ps2 的executeUpdate 。所以第二个更新的姓名变null.
以前都以为是顺序执行,用了debug才知道顺序不是我想的一样,是因为什么原因呢?
day2 测试后发现确实是跳过了最后一个输入语句 sc.nextLine() 然后继续执行了PreparedStatement的语句 ,目前推测 是不是scanner 运行的优先级问题?
还是preparedStatement默认补全后运行优先级高
突然发现 sc.nextLine() 会自动跳过 然后运行下面代码 :
但sc.next() 则不会跳过 程序运行成功
**
发现问题 根本原因 sc.nextInt( )会把键盘输入的回车 留在输入流中,所以导致了
下一个nextLine会直接读取一个回车符然后结束所以导致程序出现问题。
**
一年以后留,最近看到了java 的开发规范文档, 在工作一段时间以后发现。 我项目中 30页基础规范,大概能违反了百分之八十,不知道这是公司的普遍现象,还是小部分现象。 每个BUG解决都是健壮性问题,健壮性问题是能从基本代码反馈出来的。要养成习惯来书写代码,这篇帖子的问题也是开始学习健壮性问题的原因。但java 的开发文档真的很不错 推荐大家看一下,初学者也可以看,如果有些不会不懂的 查查资料可可以提升自己。
p.s.下面贴个阿里官方链接
https://developer.aliyun.com/topic/java20