【问题标题】:Giving null object reference on fileoutputstream.close is called?调用 fileoutputstream.close 上的空对象引用?
【发布时间】:2016-03-13 22:54:01
【问题描述】:

我正在尝试从位图获取 RGB 并同时保存 JPEG 图像,而 JPEG 字节数组可从 android camera2 api 中的ByteBuffer 获得,这是我的代码:

private class ImageSaver implements Runnable {
private final Image mImage;
private ImageSaver(Image image) {
    mImage = image;
}

@Override
public void run() {
    // TODO Auto-generated method stub
    ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
    byte[] bytes = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytes);
    final byte[] myBytes = bytes;
    Thread getRGB = new Thread() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            Bitmap bmp = BitmapFactory.decodeByteArray(myBytes, 0, myBytes.length);
            for(int y=0; y<bmp.getHeight();y++) {
                for(int x=0; x<bmp.getWidth();x++) {
                    int c = bmp.getPixel(x, y);
                    pixel++;
                    red += Color.red(c);
                    green += Color.green(c);
                    blue += Color.blue(c);
                }
            }
        }           
    };
    getRGB.start();
    FileOutputStream fileOutputStream = null;
    try {
        fileOutputStream = new FileOutputStream(mImageFile);
        fileOutputStream.write(bytes);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        mImage.close();
        if(fileOutputStream!=null)
        {
            try {                       
                fileOutputStream.close();                       
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }       
}   

现在我得到了例外

03-13 19:26:26.199:E/AndroidRuntime(19715):致命异常:我的 Camera2 基本应用程序 03-13 19:26:26.199: E/AndroidRuntime(19715): 进程: com.example.mycamera2basicapp, PID: 19715 03-13 19:26:26.199: E/AndroidRuntime(19715): java.lang.NullPointerException: file == null 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 java.io.FileOutputStream.(FileOutputStream.java:84) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 java.io.FileOutputStream.(FileOutputStream.java:72) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 com.example.mycamera2basicapp.MainActivity$ImageSaver.run(MainActivity.java:145) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 android.os.Handler.handleCallback(Handler.java:739) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 android.os.Handler.dispatchMessage(Handler.java:95) 03-13 19:26:26.199: E/AndroidRuntime(19715): 在 android.os.Looper.loop(Looper.java:211) 03-13 19:26:26.199: E/AndroidRuntime(19715): at android.os.HandlerThread.run(HandlerThread.java:61)

这里我正在初始化 mImageFile:

@Override
            public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp,
                    long frameNumber) {
                // TODO Auto-generated method stub
                super.onCaptureStarted(session, request, timestamp, frameNumber);
                createImageGallery();
                try {
                    mImageFile = createImageFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

createImageFile() 是创建 JPEG 文件的简单函数:

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "Jpeg_Image_"+timeStamp+"_";
    File image = File.createTempFile(imageFileName, ".jpg", mJpegGalleryFolder);
    mImageFileLocation = image.getAbsolutePath();
    return image;
}

当我评论这些行时

    pixel++;
red += Color.red(c);
green += Color.green(c);
blue += Color.blue(c);

文件被保存,完全没有错误。 我的意图是同时获取 RGB 和保存图像,有人可以帮助我解决这个问题,或者可以告诉我一些其他方向,我可以保存图像并也可以利用 RGB。

【问题讨论】:

  • 嗯,很明显第一个catch块被输入了,所以fileOutputStream是空的。这很容易在关闭资源之前通过 if null 检查来解决
  • 现在给我这个 java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.camera2.CaptureRequest$Builder android.hardware.camera2.CameraDevice.createCaptureRequest(int)' on a空对象引用
  • 你是如何定义 mImageFile 的?确实调用 fileOutputStream = new FileOutputStream(mImageFile);实例化 fileOutputStream?
  • 请使用新信息而不是 cmets 编辑您的问题。此外,该错误不是来自您在问题中显示的代码。但是 NullPointerExceptions 很容易修复。只要确保错误所在行的所有变量都不能为空即可。
  • 是的,我在CameraCaptureSession.CaptureCallbackonCaptureStarted下创建了文件

标签: android nullpointerexception fileoutputstream bitmapfactory


【解决方案1】:

在条件句中调用close,例如

if (fileOutputStream != null) {
  try {
    fileOutputStream.close();
  } catch (IOException e) {
    // ...
  }
}

假设您使用的是 Java 7(或更新版本),您应该真正使用 try-with-resources。

【讨论】:

    【解决方案2】:

    除了安迪的回答,我喜欢用这个实用类:

    public class CloseUtils {
    
    public static void close(AutoCloseable ...autoCloseables) throws Exception {
    
        Exception firstException = null;
    
        for (AutoCloseable autoCloseable : autoCloseables) {
    
            try {
                if (null != autoCloseable) {
                    autoCloseable.close();
                } // if
            } catch (Exception e) {
    
                if (null == firstException) {
                    firstException = e;
                } else {
                    firstException.addSuppressed(e);
                } // else
            } // catch
        } // for
    
        if (null != firstException) {
            throw firstException;
        } // if
    } // ()
    
    public static Exception closeQuietly(AutoCloseable ...autoCloseables) {
        try {
            close(autoCloseables);
            return null;
        } catch (Exception e) {
            return e;
        } // catch
    } // ()
    
    
    } // class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2017-12-28
      • 2016-10-28
      • 2016-06-04
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多