java程序sc.next( )和sc.nextLine( )排错

	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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值