3

我为一个android应用程序创建了一个java方法,它返回应用程序应该在外部目录中工作的目录。

我在处理退货时遇到问题,我不知道如何解决“缺少退货声明”的错误。

public String getpath() {
    String state = Environment.getExternalStorageState();
    if(Environment.MEDIA_MOUNTED.equals(state)) {
        String extdir = Environment.getExternalStorageDirectory().getAbsolutePath();
        File path = new File(extdir, "App");
        if(path.exists()) {
            return path.getAbsolutePath();
        }
        else {
            checkandmakepath();
            getpath();
        }
    }
    else {
        Toast.makeText(this, "Could not access External Directory!", Toast.LENGTH_LONG).show();
        Intent to_main = new Intent(this, MainActivity.class);
        startActivity(to_main);
        MainActivity.this.finish();
    }
}
4

7 回答 7

2
public String getpath()

暗示您的方法将返回一个String对象,该对象仅在您的 if 语句中完成。将其放在方法的末尾,以确保无论您经历什么条件,总是返回一些东西。(您不需要在每个 else 结束时执行此操作,因为您已经返回 if 分支。)

return null;

如果您不想在返回路径之前退出该方法,您可以while为它执行一个循环,但这可能会导致它是无限的,因此最好通过调用您的方法来处理。

于 2013-07-25T04:05:08.113 回答
1

您的问题的可能解决方案(还有更多)返回有评论的内容:

public String getpath() {
    String state = Environment.getExternalStorageState();
    if(Environment.MEDIA_MOUNTED.equals(state)) {
        String extdir = Environment.getExternalStorageDirectory().getAbsolutePath();
        File path = new File(extdir, "App");
        if(path.exists()) {
            return path.getAbsolutePath();
        }
        else {
            checkandmakepath();
            return getpath(); // Return the recursive call's value
        }
    }
    else {
        Toast.makeText(this, "Could not access External Directory!", Toast.LENGTH_LONG).show();
        Intent to_main = new Intent(this, MainActivity.class);
        startActivity(to_main);
        MainActivity.this.finish();
        // RETURN SOMETHING HERE (return ""; or the like)
        return null;
    }
}
于 2013-07-25T04:04:49.347 回答
1

在你的两者中添加return声明else blocks

于 2013-07-25T04:06:43.047 回答
1

java中每个在其签名中具有返回类型的方法都应该返回一个值。由于 if/else 语句,在您的代码中存在多个执行路径。而且您仅在 if 语句之一中进行返回。但是在没有执行 if 的情况下,流程将转到其他 else 块并且没有 return 语句,这导致编译器抱怨。

于 2013-07-25T04:07:07.680 回答
1

取决于你想要什么。但我会像下面那样做

public String getpath() {
String returnPath = null;
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)) {
    String extdir = Environment.getExternalStorageDirectory().getAbsolutePath();
    File path = new File(extdir, "App");
    if(path.exists()) {
        return path.getAbsolutePath();
    }
    else {
        checkandmakepath();
        returnPath = getpath();

    }
}
else {
    Toast.makeText(this, "Could not access External Directory!", Toast.LENGTH_LONG).show();
    Intent to_main = new Intent(this, MainActivity.class);
    startActivity(to_main);
    MainActivity.this.finish();
}
return returnPath;

}

于 2013-07-25T04:09:42.853 回答
1

您可以使用另一个变量作为标志来检查何时返回字符串。

而且我还认为,如果Environment.MEDIA_MOUNTED.equals(state)返回 false,我认为您应该定义一些 String 来返回,而不是null,以通知环境的状态。

startActivity(to_main);并且MainActivity.this.finish();应该仅在程序收到通知字符串时调用。

于 2013-07-25T04:16:51.337 回答
0
else {
  Toast.makeText(this, "Could not access External Directory!", Toast.LENGTH_LONG).show();
  Intent to_main = new Intent(this, MainActivity.class);
  startActivity(to_main);
  MainActivity.this.finish();
}

在此块中,您将启动 MainActivity 类,然后将其销毁,这没有任何意义。只需在此处检查您的逻辑。

对于 return 声明,你可以这样做

public String getpath() {
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)) {
    String extdir = Environment.getExternalStorageDirectory().getAbsolutePath();
    File path = new File(extdir, "App");
    if(path.exists()) {
        return path.getAbsolutePath();
    }
    else {
        checkandmakepath();
        return getpath();
    }
}
else {
    Toast.makeText(this, "Could not access External Directory!", Toast.LENGTH_LONG).show();
    Intent to_main = new Intent(this, MainActivity.class);
    startActivity(to_main);
    MainActivity.this.finish();
    return null;
 }
}
于 2013-07-25T07:31:34.683 回答