当我通过Findbugs运行时,我收到一个警告:
static @NonNull Object foo(@CheckForNull Object arg) {
if (arg == null) { // warning on this line
throw new NullPointerException();
}
return "something";
}
Run Code Online (Sandbox Code Playgroud)
警告的详细信息如下:
错误:
arg
必须是非空的,但标记为可为空的
模式ID :NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE
,类型:NP
,类别:STYLE
此参数始终以要求它为非空的方式使用,但该参数显式注释为
Nullable
.使用参数或注释是错误的.
有人能解释一下Findbugs在这里抱怨什么吗?
请注意,我使用的是edu.umd.cs.findbugs.annotations.*
成员,而不是javax.annotations.*
.(有区别吗?)
为Eclipse 3.6.1设置了FindBugs插件1.3.9.2009-.
Matthew Flaschen建议我使用@NonNull
,但现在我遇到了这个问题:
static void blah(@NonNull Object arg) {
if (arg == null) {
throw new NullPointerException();
}
System.out.println(arg);
}
static @CheckForNull Object bleh() {
return null;
}
//...
blah(bleh()); // warning …
Run Code Online (Sandbox Code Playgroud) 我正在处理一个使用a的类DelayQueue
.我注意到,由于DelayQueue
实现Delayed
接口中的对象,所述对象也需要实现一个compareTo()
已经完成的方法.
这是否隐含意味着我也应该考虑实施equals()
方法和hashCode()
方法?
请参阅以下代码段(剥离冗余部分以突出显示有问题的情况):
FindBugs抱怨" 方法不会释放所有路径上的锁定 ".这是误报吗?如果没有,如何解决这个问题?
try{
someLock.lock();
//do something
} finally{
if (someLock.isLocked())
someLock.unlock();
}
Run Code Online (Sandbox Code Playgroud) 这是一个类似的问题[ FindBugs警告:使用keySet迭代器而不是entrySet迭代器的效率低下
但是,我想尝试做一些不同的事情.我目前的代码在这里:
for (Double key2 : sortedPolygons.keySet()) {
if (sortedPolygons.get(key2).getExteriorRing().equals(hole)) {
sortedPolygons.remove(key2);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在链接中执行类似解决方案的操作不起作用.以下是所述解决方案的实现:
for(Map.Entry<Double, Polygon> entry : sortedPolygons.entrySet()) {
if (entry.getValue().getExteriorRing().equals(hole)) {
.....
Run Code Online (Sandbox Code Playgroud)
这里的问题是我试图删除该条目.没有entry.remove()
.如何在没有FindBugs错误的情况下替换我的第一个代码块:
低效使用keySet迭代器而不是entrySet迭代器 - >
此方法使用从keySet迭代器检索的键访问Map条目的值.在map的entrySet上使用迭代器更有效,以避免Map.get(键)查找.
需要注意的是TreeMap
,底层结构是,并且无法更改.
我有这个代码,它在FindBugs中显示以下错误:
Bug: Bad comparison of nonnegative value with -1 in hydra.extensions.drivers.eg2.internal.EG2GatewaySimulator$1.run()
This code compares a value that is guaranteed to be non-negative with a negative constant or zero.
Rank: Scary (5), confidence: High
Pattern: INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE
Type: INT, Category: CORRECTNESS (Correctness)
Run Code Online (Sandbox Code Playgroud)
对于代码:
String receivedMessage = "";
char c;
boolean isValidChar;
do {
c = (char) in.read();
isValidChar = (c != '\r') && (c != -1);
if (isValidChar) {
receivedMessage += c;
}
} while (isValidChar);
Run Code Online (Sandbox Code Playgroud) 我通过Sonarqube在我们的代码上运行findbugs,我得到一个空指针取消引用的错误:
有一个语句分支,如果执行,则保证将取消引用空值.
错误的代码就是这样:
public static boolean isBigDecimalDifferent(BigDecimal x, BigDecimal y) {
return (x != null || y != null)
&& ((x != null && y == null) || (x == null && y != null) || x.compareTo(y) != 0);
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是怎么可能的.唯一可以实现NPE的地方是调用x.compareTo(y),但如果x = null,那么Java永远不会分析那个分支,对吗?
这是一个错误,还是我错过了Java分析这个语句的方式?
UPDATE
感谢您的投入.我最后建议他们改变它:
if (x!=null && y != null)
return x.compare(y);
else
return x!=y;
Run Code Online (Sandbox Code Playgroud)
我觉得有点清楚.如果没有人同意这个改变,我会按照建议做,只是忽略这个问题,即使我宁愿避免这个.
简而言之:是否有用于 FindBugs/SpotBugs 过滤器文件的官方 DTD 或 XML 模式?
详细说明:在 FindBugs/SpotBugs 中,可以定义过滤器文件,它们是 XML 文件。我的 IDE 抱怨缺少 DTD 或 XML 架构,这很好。我知道如何抑制此警告,但我更喜欢添加正确的语法文件。因此,FindBugs/SpotBugs 过滤器文件是否提供了 DTD 或 XML Schema?我找不到一个。
我无法处理导致FindBugs抛出错误的以下警告。
我正在使用camera2 api。如您所见,我已经在检查 null 并另外捕获可能的 NullPointer 异常。CameraCharacteristics 类的 .get 方法使用 Nullable 进行注释,因此出现此错误。我不知道如何防止这种情况发生。检查 null 似乎不能完成这项工作。
同时,我将 SuppressFBWarnings Annotation 添加到我的项目中。但即使我抑制这样的警告:
@SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH")
private void setUpCamera(int width, int height) {
try {
for (String cameraId : cameraManager.getCameraIdList()) {
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
if (cameraCharacteristics != null && cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) != null) {
int lensFaceingCameraCharacteristics = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
if (cameraFacing == lensFaceingCameraCharacteristics) {
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
previewSize = getPreviewSize(streamConfigurationMap.getOutputSizes(SurfaceTexture.class), width, height);
this.cameraId = cameraId;
}
}
}
} catch (CameraAccessException | NullPointerException …
Run Code Online (Sandbox Code Playgroud) 不是来自http://findbugs.sourceforge.net/bugDescriptions.html的所有描述对我来说都很清楚.当然,我可以研究实施,但如果有人比我更有经验,一些解释和例子会很棒.
Foo
不能进入Collection<String>
.bla(Foo f){hashtable.put(f);}
F'哪个不可清洗?FingBugs也"看到"了子类吗?foo(String s){if (s intenceof String) ...
.这也是一个空检查,但这不是这里的测试...volatile
JVM无法缓存的值.那是什么意思?我等于这个方法,但Findbugs报告错误,任何想法?
@Override
public boolean equals(final Object obj) {
return obj instanceof String && this.value != null
&& this.value.equals(obj); // this.value is a String
}
Run Code Online (Sandbox Code Playgroud)
错误是:
Myclass.equals(Object)
检查操作数是否为String
我有一段代码
for(int i = 0; i < num_of_random; i++){
String str = in.readLine();
if(str != null){
String[] randoms = new String[4];
randoms = str.split(",");
dateRanges[i] = Integer.parseInt(randoms[0]);
id[i] = Integer.parseInt(randoms[1]);
flag[i] = Integer.parseInt(randoms[2]);
system[i] = Integer.parseInt(randoms[3]);
}
}
Run Code Online (Sandbox Code Playgroud)
当我针对findBugs运行此代码时,我得到了一个建议
"String [] randoms = new String [4];"
此指令为局部变量赋值,但不会在任何后续指令中读取或使用该值.通常,这表示错误,因为从未使用计算的值.
为什么我这样做?
非常感谢
我需要读一个属性文件.我正在使用BufferedReader和FileReader来实现此目的.我在try部分之前将BufferedReader初始化为null并在try部分初始化.最后,我正在关闭读者.此时,我收到标题中提到的错误.
完整的代码如下
public void getPageTitleProperties() throws IOException
{
BufferedReader br = null;
String lhs, rhs;
try
{
br = new BufferedReader(new FileReader("res" + File.separator + "pagetitle.properties"));
String line;
while ((line = br.readLine()) != null)
{
String [] keyvalue = line.split("=");
lhs = keyvalue[0];
rhs = keyvalue[1];
expectedTitles.put(lhs, rhs);
}
}
catch (RuntimeException ex)
{
ex.printStackTrace();
}
catch (IOException ex)
{
ex.printStackTrace();
}
finally
{
br.close();
}
System.out.println("Expected URLs and Titles");
for (String url : expectedTitles.keySet())
{
System.out.println(url + ":" + …
Run Code Online (Sandbox Code Playgroud) 我想摆脱FindBugs警告"DMI:随机对象创建并仅使用一次".在以下示例中,随机数仅在对象构造时生成一次.换句话说,对于类的单个实例的生命周期Wrap
,java.util.Random
将不会创建其他实例.有没有办法摆脱这个警告(除了添加注释),特别java.util.Random
是在构造函数中实例化的情况下?
public final class Wrap {
/**
* Random generated double.
*/
private final double random;
/**
* Constructor.
*/
public Wrap() {
this.random = new Random().nextDouble();
}
public Double value() {
return this.random;
}
}
Run Code Online (Sandbox Code Playgroud)