我正在尝试将示例用于Android Studio中的Google Firebase(机器学习套件)。将图像变量传递到detector.processImage方法时出现错误(错误如下所示)。
如何克服这个错误?我必须在try-catch块中使用FirebaseVisionImage.fromFilePath,但是错误消息告诉我image变量可能未初始化。
错误:可变图片可能尚未初始化
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
}
}
);
答案 0 :(得分:0)
由于这段代码而出现错误
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
抛出到较高级别),所以编译器肯定不能知道这一点,因为该异常是在运行时抛出的。 br />
并且因为在Java中必须在使用之前初始化局部变量(即使使用= null
也要初始化),所以编译器会告诉您这样做。
错误:可变图片可能尚未初始化
解决方案可能是使用null
FirebaseVisionImage image = null;
或者,更好的,以逃避Exception
。这表明存在错误。
您还可以从try - catch
块中完全解开代码。
答案 1 :(得分: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
语句在调用堆栈中通常应尽可能高。因此,我建议将其移至所有这些代码甚至更高的代码中。请记住:如果您根本没有发现该错误,Android也会打印该错误。因此,请考虑您要使用此catch
完成的工作,并相应地实施。