FirebaseVisionImage: переменная 'image', возможно, не была инициализирована

1

Я пытаюсь использовать пример для Google Firebase (комплект машинного обучения) в Android Studio. Я получаю сообщение об ошибке при передаче переменной изображения в метод детектор .processImage (ошибка показана ниже).

Как я могу пройти эту ошибку? Я должен использовать FirebaseVisionImage.fromFilePath в блоке try-catch, но сообщение об ошибке говорит мне, что переменная изображения может не инициализироваться.

ошибка: переменное изображение, возможно, не было инициализировано

        FirebaseVisionImage image;

        try {
            image = FirebaseVisionImage.fromFilePath(MainMenuActivity.this,
                    Uri.fromFile(new File("/sdcard/Download/test.jpg")));
        } catch (IOException e) {
            e.printStackTrace();
        }

        FirebaseVisionTextRecognizer detector = FirebaseVision.getInstance().getOnDeviceTextRecognizer();

        Task<FirebaseVisionText> result = detector.processImage(image)
                .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
                    @Override
                    public void onSuccess(FirebaseVisionText firebaseVisionText) {
                        // Task completed successfully
                        mainText.setText("Hello!");
                    }
                })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                // Task failed with an exception
                            }
                        }
                );
Теги:
machine-learning
firebase-mlkit

2 ответа

0
Лучший ответ

Эта ошибка возникает из-за этого куска кода

FirebaseVisionImage image;

try {
  image = FirebaseVisionImage.fromFilePath(
             MainMenuActivity.this,
             Uri.fromFile(new File("/sdcard/Download/test.jpg"))
          );
} catch (IOException e) {
  e.printStackTrace();
}

Теперь спросите себя, что происходит с image если в блоке try создается Exception?
Переменной может быть присвоено правильное значение или нет.

Поскольку вы позволяете потоку выполнения продолжаться (вы не выбрасываете Exception на верхний уровень), компилятор не может знать это наверняка, так как исключение выдается во время выполнения.
И поскольку в Java локальная переменная должна быть инициализирована перед использованием (даже с = null), компилятор говорит вам сделать это.

ошибка: переменное изображение, возможно, не было инициализировано

Решение может быть инициализировать его с null

FirebaseVisionImage image = null;

Или, что лучше, чтобы избежать Exception. Это будет сигнализировать, что есть ошибка.
Вы также сможете полностью развернуть свой код из блока try - catch.

0

Весь код, которому нужно изображение, должен находиться внутри блока try:

try {
    FirebaseVisionImage image = FirebaseVisionImage.fromFilePath(MainMenuActivity.this,
            Uri.fromFile(new File("/sdcard/Download/test.jpg")));
    Task<FirebaseVisionText> result = detector.processImage(image)
        .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
            @Override
            public void onSuccess(FirebaseVisionText firebaseVisionText) {
                // Task completed successfully
                mainText.setText("Hello!");
            }
        })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Task failed with an exception
                    }
                }
        );
} catch (IOException e) {
    e.printStackTrace();
}

FirebaseVisionTextRecognizer detector = FirebaseVision.getInstance().getOnDeviceTextRecognizer();

Обратите внимание, что оператор catch который просто печатает исключение времени выполнения, как ваша, обычно должен быть максимально высоким в callstack. Поэтому я бы порекомендовал перенести его в код, содержащий весь этот код, или даже выше. И помните: если вы не уловите эту ошибку, Android тоже распечатает ее. Так что подумайте, чего вы пытаетесь достичь с помощью этого catch и примените его соответствующим образом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню