jhizzo
jhizzo

Reputation: 13

FirebaseVisionImage: variable 'image' might not have been initialized

I'm trying to use the example for Google Firebase (machine learning kit) in Android Studio. I'm getting an error when passing the image variable into the detector.processImage method (error shown below).

How can I get past this error? I have to use the FirebaseVisionImage.fromFilePath within a try-catch block, but the error message is telling me that the image variable may not be initialized.

error: variable image might not have been initialized

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

Upvotes: 1

Views: 1499

Answers (2)

LppEdd
LppEdd

Reputation: 21124

That error emerges because of this piece of code

FirebaseVisionImage image;

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

Now, ask yourself, what happens to image if an Exception is thrown inside the try block?
The variable might have been assigned a valid value, or it might have not.

Because you're letting the execution flow to continue (you aren't throwing the Exception to the upper level), the compiler cannot know that for sure, since the exception is thrown at run-time.
And because in Java a local variable must be initialized before usage (even with = null), the compiler is telling you to do so.

error: variable image might not have been initialized

The solution might be to initialize it with null

FirebaseVisionImage image = null;

Or, a better one, to let escape the Exception. That will signal there is a bug.
You'll also be able to completely unwrap your code from the try - catch block.

Upvotes: 1

Frank van Puffelen
Frank van Puffelen

Reputation: 598740

All code that needs the image should be inside the try block:

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

Note that a catch statement that just prints the runtime exception like yours does, should usually be as high as possible in the callstack. So I'd recommend moving it to the code that alls this code, or even higher up. And keep in mind: if you don't catch that error at all, Android will print it too. So consider what you're trying to accomplish with this catch and implement it accordingly.

Upvotes: 0

Related Questions