0

我正在使用 Aide,它在 openInputStream 上给了我这个奇怪的错误:

The Exception 'java.io.FileNotFoundException' must be caught or declared in the throws clause

我的代码:

case R.id.album:
            intent = new Intent("android.intent.action.GET_CONTENT");
            intent.setType("image/*");
            startActivityForResult(intent, R.id.album);
            break;
        case R.id.camera:
            intent = new Intent("android.media.action.IMAGE_CAPTURE");
            intent.putExtra("output", Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "camera.jpg")));
            startActivityForResult(intent, R.id.camera);
            break;

protected void onActivityResult(int request, int result, Intent data) {
    switch (request) {
        case R.id.album:
            if (result == -1) {
                this.paintView.setPicture(BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData())));

            }
        case R.id.camera:
            if (result == -1) {
                try {
                    File file = new File(Environment.getExternalStorageDirectory(), "camera.jpg");
                    this.paintView.setPicture(BitmapFactory.decodeFile(file.toString()));
                    file.delete();
                } catch (Exception e) {
                }
            }

我没有发现我的代码有任何问题,也许 Aide 需要更多代码,或者它不支持这种代码。我试图从与此类似的其他问题中找出答案,但我一无所获。代码有替代品吗?

4

2 回答 2

3

您的代码的问题是您正在调用一个可能引发FileNotFoundException...但您没有在围绕调用的异常处理程序中捕获异常的方法。

我希望它在这里:

this.paintView.setPicture(BitmapFactory.decodeStream(
    getContentResolver().openInputStream(data.getData())));

我还会注意到这样的代码:

try {
    ...
} catch (Exception e) {
    // do nothing!
}

称为“异常压缩”。这是不好的做法。这种事情隐藏了错误。1) 它通常允许异常造成的“损害”扩散到应用程序的其他部分。2)它使准确诊断错误的真正原因变得更加困难。

而你正在挤压Exception,这让事情变得更糟。

简而言之,如果你习惯性地 squash java.lang.Exception

  • 您的代码可能不可靠
  • 你不会知道为什么,而且
  • 你将无法修复它。
于 2016-11-25T23:08:52.380 回答
0

您正在尝试访问文件或打开文件,FileNotFoundException 很可能会发生。

所以您需要先捕获该错误,然后再捕获任何其他类型的异常。

所以你的代码应该是这样的:

` switch (request) {
    case R.id.album:
        try{
if (result == -1) {    
this.paintView.setPicture(BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData())));
      }
 }
catch (FileNotFoundException e) {}
catch (Exception e){}`

否则,您可以将相同的内容扔给尝试访问它的其他方法。

带有 throws 子句:

protected void onActivityResult(int request, int result, Intent data) throws FileNotFoundException{ //your code }

如果您正在使用此方法,那么您必须看到,此异常被您正在使用的其他方法捕获。

于 2016-11-25T23:13:14.673 回答