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