Странная ошибка в открытом входном потоке компилятора помощника должна быть объявлена

Я использую 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 нужно больше кода или он не поддерживает этот вид кода. Я пытался выяснить это из других вопросов, похожих на это, но ничего не нашел. есть ли замена для кода?

2 ответа

Решение

Проблема с вашим кодом в том, что вы вызываете метод, который может FileNotFoundException... но вы не перехватываете исключение в обработчике исключений, который окружает вызов.

Я ожидаю, что это здесь:

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

Я также хотел бы отметить, что код такой:

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

называется "Исключение исключения". Это плохая практика. Такая вещь скрывает ошибки. 1) Как правило, это позволяет "ущербу", вызванному исключением, распространяться на другие части приложения. 2) Это значительно затрудняет точную диагностику истинной причины ошибок.

А ты давишь Exception, что делает вещи хуже.

Короче говоря, если вы обычно сквош java.lang.Exception:

  • ваш код может быть ненадежным
  • ты не узнаешь почему, и
  • Вы не сможете это исправить.

Вы пытаетесь получить доступ к файлу или открыть файл, есть вероятность, что 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){}`

или вы можете бросить то же самое в другой метод, который пытается получить к нему доступ.

с предложением бросков:

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

Если вы используете этот метод, то вы должны увидеть, что это исключение перехватывается в каком-то другом методе, который вы используете.

Другие вопросы по тегам