【问题标题】:FirebaseVisionImage: variable 'image' might not have been initializedFirebaseVisionImage:变量“图像”可能尚未初始化
【发布时间】:2019-03-03 18:54:44
【问题描述】:

我正在尝试在 Android Studio 中使用 Google Firebase(机器学习工具包)的示例。将图像变量传递给detector.processImage 方法时出现错误(错误如下所示)。

我怎样才能克服这个错误?我必须在 try-catch 块中使用 FirebaseVisionImage.fromFilePath,但错误消息告诉我图像变量可能未初始化。

错误:变量图像可能尚未初始化

        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
                            }
                        }
                );

【问题讨论】:

  • 因为您在 try-catch 中初始化了图像,所以它可能不会被初始化。您可以将其余代码移动到 try-catch 中,或者在尝试使用图像之前检查图像是否已初始化。
  • 请不要仅仅因为你使用它就用 android-studio 标签标记问题:Android Studio 标签应该只在你对 IDE 本身有疑问时使用,而不是你编写的任何代码(或者想写)在里面。
  • 知道了,抱歉。第一次在stackoverflow上发问题,下次一定会更恰当地使用标签!

标签: java android machine-learning firebase-mlkit


【解决方案1】:

由于这段代码而出现该错误

FirebaseVisionImage image;

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

现在,问问自己,如果 Exception 被扔进 try 块内,image 会发生什么?
变量可能被分配了一个有效值,或者它可能没有

因为您让执行流程继续进行(您没有将Exception 抛出到上层),所以编译器无法确定这一点,因为异常是在运行时抛出的。
而且因为在 Java 中,必须在使用前初始化局部变量(即使使用 = null),编译器会告诉您这样做。

错误:变量图像可能尚未初始化

解决方案可能是使用null 对其进行初始化

FirebaseVisionImage image = null;

或者,更好的,让Exception 逃脱。这将表明存在错误。
您还可以从 try - catch 块中完全解开您的代码。

【讨论】:

    【解决方案2】:

    所有需要图像的代码都应该在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 完成什么并相应地实施它。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2015-07-04
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多