FirebaseVisionImage: переменная 'image', возможно, не была инициализирована - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь использовать пример для 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
                            }
                        }
                );

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Весь код, которому требуется изображение, должен находиться внутри блока 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 и реализуйте его соответствующим образом.

0 голосов
/ 03 марта 2019

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

FirebaseVisionImage image;

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

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

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

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

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

FirebaseVisionImage image = null;

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

...