Java 取消绑定cameraCharacteristics可能会产生Nullpointer异常和FindBugs
我无法处理以下导致FindBugs抛出错误的警告 我正在使用Camera2API。 正如您所看到的,我已经在检查null并另外捕获一个可能的null指针异常。CameraCharacteristics类的.get方法使用Nullable注释,因此出现此错误。我不知道怎样才能防止这种情况。检查null似乎不起作用 同时,我将SuppressFBWarnings注释添加到我的项目中。但即使我抑制了这样的警告:Java 取消绑定cameraCharacteristics可能会产生Nullpointer异常和FindBugs,java,android,annotations,findbugs,unboxing,Java,Android,Annotations,Findbugs,Unboxing,我无法处理以下导致FindBugs抛出错误的警告 我正在使用Camera2API。 正如您所看到的,我已经在检查null并另外捕获一个可能的null指针异常。CameraCharacteristics类的.get方法使用Nullable注释,因此出现此错误。我不知道怎样才能防止这种情况。检查null似乎不起作用 同时,我将SuppressFBWarnings注释添加到我的项目中。但即使我抑制了这样的警告: @SuppressFBWarnings(value = "NP_NULL_ON_SOME
@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 eae) {
Logger.error(eae.getMessage());
}
}
FindBugs分析中仍然会出现错误。这是一个自动装箱陷阱。 让我们看一看这行:
int lensFaceingCameraCharacteristics = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
如果cameraCharacteristics.get(cameraCharacteristics.LENS_FACING)将返回null,则自动装箱将产生NPE,因为null无法转换为原语int
这里有一些有趣的故事
您可以将变量/字段重构为包装类,如Integer、Float等
private Integer cameraFacing;
但是在这种情况下,您可能需要解决一些新的NPE警告。因此,您可以像这样重构代码:
if (cameraCharacteristics != null && cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) != null) {
Integer lensFaceingCameraCharacteristics = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
if (lensFaceingCameraCharacteristics != null
&& cameraFacing == lensFaceingCameraCharacteristics) {
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
previewSize = getPreviewSize(streamConfigurationMap.getOutputSizes(SurfaceTexture.class), width, height);
this.cameraId = cameraId;
}
}
这是一个自动装箱陷阱。 让我们看一看这行:
int lensFaceingCameraCharacteristics = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
如果cameraCharacteristics.get(cameraCharacteristics.LENS_FACING)将返回null,则自动装箱将产生NPE,因为null无法转换为原语int
这里有一些有趣的故事
您可以将变量/字段重构为包装类,如Integer、Float等
private Integer cameraFacing;
但是在这种情况下,您可能需要解决一些新的NPE警告。因此,您可以像这样重构代码:
if (cameraCharacteristics != null && cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) != null) {
Integer lensFaceingCameraCharacteristics = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
if (lensFaceingCameraCharacteristics != null
&& cameraFacing == lensFaceingCameraCharacteristics) {
StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
previewSize = getPreviewSize(streamConfigurationMap.getOutputSizes(SurfaceTexture.class), width, height);
this.cameraId = cameraId;
}
}
哇,太谢谢你了!除此之外,我还必须在streamConfigurationMap.getOutputsizes(..)之前检查streamConfigurationMap上的null,但现在一切都正常:-)哇,非常感谢!除此之外,我还必须在streamConfigurationMap.getOutputsizes(..)之前检查streamConfigurationMap上的null,但现在一切正常:-)