FirebaseVisionImage:变量“ image”可能尚未初始化

时间:2019-03-03 18:54:45

标签: java android machine-learning firebase-mlkit

我正在尝试将示例用于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
                            }
                        }
                );

2 个答案:

答案 0 :(得分:0)

由于这段代码而出现错误

FirebaseVisionImage image;

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

现在,问问自己,如果在image块中抛出Exceptiontry会发生什么?
变量可能已分配了有效值,或者可能未

因为您要让执行流程继续进行(没有将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完成的工作,并相应地实施。