拆箱 cameraCharacteristics 可能会产生 Nullpointer Exception 和 FindBugs

J. *_*egg 1 java android unboxing annotations findbugs

我无法处理导致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 eae) {
        Logger.error(eae.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

FindBugs 分析中仍然出现错误。

Ole*_*lov 5

这是一个自动装箱陷阱。让我们看一下这条线:

int lensFaceingCameraCharacteristics = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
Run Code Online (Sandbox Code Playgroud)

如果cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)将返回null则自动装箱将产生NPE因为null不能转换为原始int

这是一些有趣的文章

您可以将变量/字段重构为包装类,如IntegerFloat等。

private Integer cameraFacing;
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,您可能需要解决一些新的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;
            }
        }
Run Code Online (Sandbox Code Playgroud)