![]() |
1
7
虽然这是一个 设计 错误,不是 文法的 错误。 这是引自 有效的Java第二版,项目17:设计和文档继承,否则禁止 :
一个顺从的编译器会让它编译得很好,因为它在语言上是合法的。幸运的是,代码分析工具可以用来发现这些设计错误,例如
|
![]() |
2
4
这是一个经典的发现。不要在构造函数中使用实例方法。 您可能需要查看PMD,特别是“constructorcallsoverridablemethod”规则。 |
![]() |
3
3
|
![]() |
4
2
父亲Josh Bloch说:“有效的爪哇: 你不能从Java中的构造函数调用虚拟方法。
这会导致你观察到的确切问题。打电话的时候
|
![]() |
5
0
通常,编译器不会试图证明字段的空性。它将对局部变量执行此操作,但更改字段值(即序列化、反射或其他欺骗)的方法太多,无法完成彻底的工作。 如果可能的话,您应该尝试将字段声明为final,这对这一点和其他许多事情有很大帮助。或者,编写代码来防御空值(即“test”.equals(foo)而不是foo.equals(“test”)或显式空值检查) |
![]() |
6
0
检查可能是或不是编程错误的各种“不太难检查”的东西不是编译器的工作(其中有数百种)。 可以说,一个IDE可能会用一个可配置的警告来标记这一点,但同样的,这样的东西太多了,如果在按需编译期间,IDE必须检查所有这些东西,那么它将大大降低日常工作的速度。 这确实是静态样式的检查程序(如findbugs)所要做的事情。还有-惊喜!-它对这种情况进行了检查: UR: Uninitialized read of field method called from constructor of superclass |