PDF 课件和源代码下载地址:
https://github.com/geektime-geekbang/LetsJava
作者回复: 这个问题的原因是IntelliJ给JDK起名字起的不一样造成的. 比如说对于JDK 11, 有时候IntelliJ会把它叫做JDK_11, 有时候会带上小版本, 比如JDK_11.02这种. 更不用说JDK版本不一样的情况, 比如JDK_8.
解决的方式就是选择IntelliJ里已有的JDK. 方法很多, 我举一个成功率比较高的例子.
在File 菜单里选择Project Structure
在弹出的窗口里, 左边Project Settings下面, 选择Project
看到右边的面板, Project SDK 应该是红色报错对吧, 说找不到JDK之类的. 着时候可以在下拉菜单里选择一个自己的JDK就可以了.
如果没有找到自己安装的JDK, 可以点击Edit, 然后点击面板上方的"+", 创建一个新的JDK. 目录就是JDK的安装目录.
作者回复: 两条错误日志是和代码版本控制相关的(git),和代码本身的错误没关系。
可以按照我这个文章检查一下 JDK 的配置并尝试重新编译一下
https://github.com/deepnighttwo/LetsJava/blob/master/FAQ/01%E7%AB%A0-%E5%A6%82%E4%BD%95%E5%9C%A8IntelliJ%20IDEA%E9%87%8C%E9%85%8D%E7%BD%AEJDK.md
作者回复: 应该是前面有个回车换行符没有被消费掉。可以参考这个文章
https://github.com/deepnighttwo/LetsJava/blob/master/FAQ/02%E7%AB%A0%20Scanner%E9%87%8CnextInt%E7%9A%84%E5%B0%8F%E5%9D%91.md
也就是说scanner.nextBoolean();只会消费true或者false这几个字符,如果后面有回车换行符, 就不会被消费。如果后面来个nextLine,感觉上就是直接“跳过”,没有机会输入内容了。
所以你这边的
customer.name = scanner.nextLine();
之前,应该有个scanner.nextXXX之类的,没有消费掉回车换行符。
建议都使用scanner.nextLine();,对于boolean,可以使用Boolean.parseBoolean(scanner.nextLine().trim())
作者回复:
已提交PR修正, 谢谢~
https://github.com/geektime-geekbang/LetsJava/pull/3
作者回复:
这种方式很有用👍
作者回复: 老脸通红...... 买价卖价傻傻没有分清楚. 源代码里修正了. 谢谢帮忙活捉bug一只~
https://github.com/deepnighttwo/LetsJava/blob/master/%E7%AC%AC%E4%BA%8C%E7%AB%A0%20Java%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%BC%96%E7%A8%8B/09.%20%E6%89%93%E9%80%A0%E4%B8%80%E4%B8%AA%E5%B0%8F%E8%B6%85%E5%B8%82/code/src/com/geekbang/RunLittleSupperMarketAppMain2.java#L90-L91