我决定编辑我的问题,在一年之后,我改变了使用空值的方式:
至于我的代码:
>
构造函数使用对象检查空值。requirennoull
,如下所示:
公共脚注(字符串a){this. a=Objects.requireNonNull(a, a);}
方法检查空使用Preconditions.checkNotNull
从番石榴框架每当我使用它在我的项目或Objects.requireNonNull
:
公共void foobar(字符串a){premissions.checkNotNull(a,“a”);}
使用一个或另一个取决于我是否重用这个值。
我不是每次都检查方法参数,而是主要检查public
方法。这样做的目的不是取代默认的运行时检查,因为它比我能做的更有效地抛出NullPointerException
。
我目前正在对所有参数、字段、方法结果(返回)使用@Nonnull
或@Nullable
注释,但我想知道什么才是真正最好的:
@parameterRenonNull
不适用于它们)。我想要一种可移植的方式(我在这里读到,我可以用特定的名称创建自己的注释,这对findbugs有用)此外,自Eclipse3.8以来,还存在基于注释的空检查。但我有一些“简单”的问题:
@ParameterAreNonnullByDefault
class Foobar<E extends Throwable> {
@Nullable private Constructor<E> one;
@Nullable private Constructor<E> two;
public Foobar(Constructor<E> one, @Nullable Constructor<E> two) {
this.one = Objects.requireNonNull(one, "one");
this.two = two;
}
// don't care about exceptions.
public E getInstance(String msg, Throwable t) {
if (null == two) {
return (E)one.newInstance(msg).initCause(t);
}
return two.newInstance(msg, t);
}
}
为什么告诉我2在那个位置是无效的,为什么他警告我2的潜在无效访问?
我将使用外部工具Checker框架的Nullness Checker来回答您的问题。它有一个Eclipse插件,它读取Eclipse和FindBugs使用的注释。它的分析比内置的Eclipse nullness分析更好,但是它的IDE集成不如Eclipse的好。两者都是有价值的工具,你可以决定哪一个最适合你。
我如何判断我的字段和方法结果默认为非空?
这是默认值。你什么都不用做。
如果我用@ParameterareNonnullByDefault注释包com.foobar,它是否也适用于com.foobar.example?
您根本不需要更改默认值(尽管您可以,如果出于某种原因,您希望在某些或所有代码位置使用@Nullable
作为默认值)。
当@Nonnull注释时,我是否应该检查每个参数(我当前正在检查构造函数参数)?
如果您担心nullness分析不可靠(也就是说,即使您的代码可以抛出空指针异常,分析也不会给出错误),或者如果您没有在整个程序上运行分析,则只需要编写运行时检查。Eclipse和FindBugs的空分析在设计上都是不合理的。Checker框架在设计上是合理的。当然,任何工具都可能包含错误。
此外,自Eclipse3.8以来,还存在基于注释的空检查。但我有一些“简单”的问题:
Checker框架精确地处理这个简单的案例——完全按照您的意愿。
更具体地说,检查框架在检查单线程代码时这样做。
如果您的代码是多线程的,那么您可以提供命令行选项。在这种情况下,检查框架将发出警告,因为另一个线程可能会在检查和使用之间重置两个代码。如果您的代码是多线程的,而其他线程正在同时修改字段,那么您可能希望使用锁。按照另一个答案的建议,将值复制到局部变量中是一个坏主意。它不仅降低了代码的可读性,而且不一定按照您的意愿运行;例如,其他线程可能违反表示不变量,并导致您的代码以其他方式崩溃。
以下是如何使用Eclipse实现您的所有请求:
自Eclipse Keler以来,@NonNullByDefault
注释会影响所有这些位置。从Luna开始,使用Java8和类型注释,效果可以进一步微调。
当您询问便携式解决方案时:在CI构建中使用Eclipse编译器并不困难,请参阅JDT常见问题解答,甚至可以告诉IntelliJ使用Eclipse编译器。
Java没有子包的概念。如果包名称共享一个公共前缀,则没有语义含义。因此,遗憾的是,每个包都必须单独注释。
一旦您准备好将默认值应用于所有包,如果您错过了包的默认值,Eclipse会被告知警告您/甚至引发错误。该选项称为:“包上缺少'@NonNullByDefault'注释”。
在理想情况下,编译器将完全检查所有@NonNull
参数,您不需要任何运行时检查。添加这些检查需要多大的安全性,这是一个问题,但如果您这样做,我看不出有什么理由将构造函数参数与方法参数区别对待。
也许,如果您有final@NonNull
字段,那么构造函数有特殊的责任,应该进行更多的检查,但这基本上是您的代码样式和安全要求的问题。
Eclipse仅对局部变量执行全流分析。它是以这种方式精心设计的,以保护您免受副作用、别名和并发性的风险,尽管之前进行了空检查,但这些风险都可能导致NPE。所谓的字段“语法分析”是作为一种(有限的)折衷方案引入的,但真正的解决方案必须是,将值提取到局部变量中,以便对其进行全面分析。Eclipse甚至提供了此更改的快速修复。
就getInstance
中two
变量上的警告而言,null分析不够聪明,无法确定字段不能为null。您可以通过使用局部变量来解决此问题:
public E getInstance(String msg, Throwable t) {
final Constructor<E> localTwo = two;
if (null == localTwo) {
return (E)one.newInstance(msg).initCause(t);
}
return localTwo.newInstance(msg, t);
}
有一个设置启用语法空分析字段
在首选项
if (two != null) {
return two.newInstance(msg, t);
}
没有警告。
问题内容: 我已经安装了最后一个JDK 8(b116),但是我注意到我不能使用类型注释。例如,如果我编写以下内容,请阅读Java教程: 要么 编译器给我以下错误: 现在可以了。 在使用类型注释之前,我们必须使用注释注释。请看下面的评论! 我也不知道JDK中是否会插入诸如,等的注释,或者是否必须下载Checker Framework 问题答案: 您已经自己回答了问题的第一部分。 对于第二部分: 我也
我正在尝试在Eclipse中添加GXT面板。使用Ext GWT(GXT) 我无法弄清楚Google Web Toolkit在哪里 请帮我在Eclipse中获取GXT调色板。谢谢
在eclipse上,我尝试使用maven-archetype-webapp创建一个项目,尽管目录结构是正确的,但构建插件却被搞乱了。在执行mvn eclipse:eclipse-dwtpversion=2.0之后,甚至项目结构也变得混乱了。 另一方面,我尝试创建一个动态web项目,并将其转换为maven项目。但是,这并没有修复目录结构。 我试图用war插件和src->main->java,weba
我想下载android谷歌代码svn存储库,所以选择了这个颠覆性的,但是它没有安装在我的新eclipse上,这里我把错误的详细信息放在这里。帮帮我。 收集要安装的项时出错,会话上下文为:(profile=epp.package.jee,phase=org.eclipse.equinox.internal.p2.engine.phases.collect,operand=,action=)。无法读取
因此,我选择了另一个安装e(fx)clipse的选项,并在http://www.eclipse.org/efxclipse/install.html#for-the-havided找到了步骤 无法完成安装,因为找不到一个或多个必需项。正在安装的软件:e(fx)clipse-ide-Kepler 0.9.0.201401250805(org.eclipse.fx.IDE.all.Kepler.fea