Я хочу написать такой код

public int recursiveMethod() {
    for (int i = 0; i < 10; i++) {
        if (someBool) {
            return recursiveMethod();
        } else {
            return -1;
        }
    }
}

Но это дает ошибку компиляции missing return statement. Есть ли другой способ добиться этого?

ОБНОВЛЕНИЕ : актуальный код

public static File searchFile(File currentFile) {
    File[] results = null;

    if (currentFile.isDirectory()) {
        for (File file : currentFile.listFiles()) {
            if (file.isDirectory()) {
                return searchFile(file);
            } else {
                results = file.getParentFile().listFiles(new FilenameFilter() {
                    public boolean accept(File dir, String name) {
                        return name.toLowerCase().endsWith(".sh");
                    }
                });

                if (results.length > 0) {
                    return results[0];
                } else {
                    return null;
                }
            }
        }
    } else {
        results = currentFile.getParentFile().listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".sh");
            }
        });

        if (results.length > 0) {
            return results[0];
        } else {
            return null;
        }
    }
}
0
Darshana 13 Май 2014 в 13:22

2 ответа

Лучший ответ

Ваш код сломан из-за того, как он зацикливается - вы останавливаетесь на самой первой итерации, сообщая об успехе или неудаче. Вам следует продолжать цикл до тех пор, пока вы не найдете что-то или не исчерпаете элементы для итерации.

Я бы изменил общую структуру так, чтобы последний оператор в методе был return null; - так что в любой момент вы можете вернуть положительный результат, вы это сделаете, но в противном случае вы просто позволите ему провалиться . Так что-то вроде этого:

public static File searchFile(File currentFile) {
    if (!currentFile.isDirectory()) {
        throw new InvalidArgumentException("Starting point must be a directory");
    }
    for (File file : currentFile.listFiles()) {
        if (file.isDirectory()) {
            File result = searchFile(file);
            if (result != null) {
                return result;
            }
        } else if (file.getName().toLowerCase().endsWith(".sh")) {
            return file;
        }
    }
    // Not found anything: return null to indicate failure (in this branch)
    return null;
}

(Я удалил вызов getParentFile() и изменил структуру кода для простоты. Теперь он только принимает каталог в качестве отправной точки, но это значительно упрощает ситуацию и имеет гораздо больший смысл во всяком случае, ИМО.)

3
Jon Skeet 13 Май 2014 в 09:48

Что такое someBool? Вы вызываете recursiveMethod(), если someBool истинно и каждый раз, когда вызывается recursiveMethod(), значение i начинается с 0 и продолжает вызывать recursiveMethod().

Как упоминалось в предыдущем комментарии, простое размещение оператора return в конце метода не гарантирует, что вы достигнете того, что вам нужно.

0
Ashish 13 Май 2014 в 09:32