Ryan A.
Ryan A.

Reputation: 41

Recursion method continues after returning value?

I'm writing a quick Java recursion method that, given a root folder and filename, searches your files for said file name.

import Java.io.File;

public static String searchForFile(File currentFolder, String filename)
{
    try
    {
        File[] path = currentFolder.listFiles();

        for (int i = 0; i < path.length; i++)
        {
            if (path[i].isDirectory())
            {
                System.out.println("Directory: " + path[i].toString());
                searchForFile(path[i], filename);
            }
            else
            {
                System.out.println("File: " + path[i].toString());

                if(path[i].getName().equals(filename))
                {
                    System.out.println("Your file has been found!";
                    return path[i].toString();
                }
            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return null; // Omitting this line yields compiling errors, not sure why?
}

public static void main(String[] args)
{
    System.out.println("Hello, enter the root folder and file name.");
    String rootFolder = "Desktop";
    String fileName = "Hello.txt";

    File f = new File("C:\\Users\\Me\\" + rootFolder);
    searchForFile(f, fileName);

}

The program itself technically works, however searchForFile() keeps iterating even after the requested file is found. For example, I'd get an output such as:

File: C:\Users\Me\Desktop\My Stuff\NotHello.txt
**File: C:\Users\Me\Desktop\My Stuff\Hello.txt**

Your file has been found!

File: C:\Users\Me\Desktop\My Stuff\AlsoNotHello.txt
File: C:\Users\Me\Desktop\My Stuff\StillNotHello.txt
File: C:\Users\Me\Desktop\My Stuff\WhyIsThisMethodStillRunning.txt

I've been scratching my head at this for awhile now. I thought return always exits the method, so why does the recursion continue even after it returns a value? I haven't found any similar questions asked, so any help would be much appreciated!

(Also, how could I edit the method so that it returns a blank "" string if the requested file is not found?)

Upvotes: 3

Views: 76

Answers (1)

Simon Forsberg
Simon Forsberg

Reputation: 13331

You are returning from the innermost call, when you've found the file. But when you are scanning a directory, you are not using the return value.

Change this:

searchForFile(path[i], filename);

to:

String result = searchForFile(path[i], filename);
if (result != null) {
    return result;
}

The return null; in the bottom of your method is there because all methods needs to return a value. No matter if the file is found or not. If the file is not found within the current directory (or one of its subdirectories), you can return null; to indicate that it wasn't found.

Side suggestion: Use Optional in Java 8 instead of null.

Upvotes: 2

Related Questions