【问题标题】:eclipse: raise compiler warning when using fields that are not initializedeclipse:使用未初始化的字段时引发编译器警告
【发布时间】:2018-10-04 14:38:13
【问题描述】:

在 GWT 应用程序 (gwt: creating an instance of Window causes application to hang out) 的上下文中,我将值设置为我忘记初始化的文本小部件,导致类似于浏览器控制台中的空指针异常。

令我困扰的是 Eclipse 没有显示任何警告/错误。所以我检查了以下示例:

Object obj;
//obj = new Object();
obj.toString();

Eclipse 说:

局部变量obj可能还没有初始化

但是当 obj 是类的一个字段时,我没有收到任何警告:

public class MyClass
{
   Object obj;

   public MyClass()
   {
        //obj = new Object();
        obj.toString();// I expect to get some warning here
   }
}

我转到 Window > Preferences > Java > Compiler > Errors/Warnings,我使用文本“null”进行过滤,唯一相关的结果在名为“Null analysis”的部分下;此处,空指针访问已设置为引发警告; 潜在的空指针访问设置为忽略,我对其进行了修改以引发警告,但对于上述示例,我仍然没有收到任何警告。有没有其他方法可以告诉编译器提醒我这种情况?

【问题讨论】:

  • 字段默认初始化为 null(基本类型为 0)。
  • 我知道这一点。问题是编译器在尝试操作保持为空的字段时什么也没说

标签: java eclipse nullpointerexception warnings


【解决方案1】:

我用谷歌搜索了一下,发现了Eclipse's reporting bug system,我从作者那里看到了这句话:

默认情况下未分配未分配的变量,用户应在代码的所有可能分支中分配它,否则会发生编译时错误。

还有:

只有字段有默认值。局部变量需要在所有可能的路径中初始化。

所以他们的思路是他们需要你在需要的时候初始化变量,如果你没有做应该是编译器的问题,就词法、语法和语义分析器来说都没有问题担心。这就是不发出警告的原因。

【讨论】:

  • 关于你的回答,我想说三点: 1. 我对默认不分配局部变量一点也不感兴趣;在这种情况下,编译器会引发错误,我完全可以接受这种行为。我的问题解决了另一个方面 - 具有空值的字段和编译器没有抱怨这一点。 2. 好的,字段获取默认值——在这种情况下为空;这一点也没有改变问题:我仍然有一个空字段(无论它是如何为空的),并且当我操作它时编译器不会抱怨;
  • 3.即使 Eclipse 网站提供了一些最佳实践建议,这种行为通常可以在 Eclipse 设置中被覆盖。这正是我一直在寻找的
  • 为什么编译器应该关心你的空字段,只要你不使用它?
  • 我实际上正在使用该字段 - 我调用 toString() 或任何其他方法的那一刻;我希望编译器在我使用它时确定该字段是否为空
  • 但是在定义它时并没有使用它。只要涉及编译器,您就已经在其他地方定义了它,或者它将成为它的默认值null
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2013-02-20
  • 2017-11-24
相关资源
最近更新 更多