如果不满足某个条件,是否可以使用非 void 方法不返回任何内容

Is it possible to return nothing with a non-void method if a certain condition is not met

提问人:BlueInundation 提问时间:3/27/2023 最后编辑:BlueInundation 更新时间:3/27/2023 访问量:249

问:

如果某个条件不满足,有没有办法使用非 void 方法不返回任何内容(甚至不返回 null),但如果满足该条件,则返回方法类型的某些东西(如果方法为“int”,则返回“int”)?

现在我已经看到了评论,我已经阅读了有关可选课程的信息,但无法弄清楚。因此,如果我有类似 ArrayList 方法的东西,我会怎么做?

static ArrayList<String> method() {
    if (true) {
        return ArrayList; }
    else {
        ? } //(equivalent of return nothing, not even null) 

所以它会是这样的,但你能帮忙解决确切的语法吗?

static Optional method() {
    if (true) {
        return ArrayList<String>; }
    else {
        Optional.empty() } //(equivalent of return nothing, not even null) 

好的,下面有一条评论,让我发布我的递归函数。我在这里想要的是第一个 if 语句,有一个 print 和一个 return 语句。但是在函数的末尾有一个必要的返回 null,因此该函数返回 null。我希望函数返回它打印的内容,即索引,这样我就可以将其用作其他地方的输入。

static ArrayList<String> connectionFinder(String linInit, String linFin, ArrayList<String> indices, ArrayList<ArrayList<String>> linArray) {
        if (linInit.equals(linFin)) {    //returns the indices list if linInit reaches linFin
            System.out.println(indices);
            return indices;
        }
        for (int i = 0; i < linArray.size(); i++) {
            if (linArray.get(i).contains(linInit) && !indices.contains(i)) {     //checks which stations are exchange stations for linInit, and checks the index to prevent infinite recursion
                for (int j = 1; j < linArray.get(i).size(); j++) {
                    if (!linArray.get(i).get(j).equals(linInit)) {    //j starts from 1 so as to avoid the station name, and checks if the linInit is different to prevent infinite recursion
                        connectionFinder(linArray.get(i).get(j), linFin, add(indices, i), linArray);    //changes the linInit, and adds the index ( add(ArrayList,value) is a custom method that returns the ArrayList instead of a boolean -ArrayList.add(value) returns a boolean-)
                    }
                }
            }
        }
        indices.remove(indices.size()-1);
        return null;
    } 
Java 方法 类型 返回

评论

4赞 Mar-Z 3/27/2023
没有。但您可以尝试 Optional 类。它正是针对此用例引入的。
3赞 Chaosfire 3/27/2023
不,这是不可能的。如果满足该条件,则最接近的是抛出异常,并在调用方中处理它。
4赞 njzk2 3/27/2023
通常,如果没有要返回的内容,则返回列表的方法将返回一个空列表。
2赞 rzwitserloot 3/27/2023
在评论中,您写道“我需要它不返回任何内容,即通过”。这没有意义。试着向来电者(这里打电话的人)解释你打算在他们打电话时发生什么,你编造的这个模糊的事情应该会发生。应用程序应该退出吗?method()method()
0赞 BlueInundation 3/27/2023
@njzk2但有一些东西要返回,我相应地编辑了我的帖子。我们有一个递归函数。

答:

3赞 ProgrammingSolver 3/27/2023 #1

您无法从非 void 方法中返回任何内容。在大多数情况下,如果返回值没有意义,则最佳做法是引发异常。

例如:

public void setCarValue(int value) {
    if (value < MIN_VALUE) {
        throw new CarException(String.format("Value may not be less than %d", MIN_VALUE));
    }
    this.value = value;
}
1赞 njzk2 3/27/2023 #2

我会写一个单独的函数:

public static ArrayList<String> connectionFinder(String linInit, String linFin, ArrayList<ArrayList<String>> linArray) {
  ArrayList<String> indices = new ArrayList<>();
  connectionFinder(linInit, linFin, indices, linArray);
  return indices;
}

而你的功能,现在作为一个虚空:

private static void connectionFinder(String linInit, String linFin, ArrayList<String> indices, ArrayList<ArrayList<String>> linArray) {
    if (linInit.equals(linFin)) {
        return;
    }
    for (int i = 0; i < linArray.size(); i++) {
        // Loop omitted for clarity
    }
    indices.remove(indices.size()-1);
}

评论

0赞 BlueInundation 3/27/2023
谢谢 njzk2。你的建议是正确的。但是有一个问题(我找到了一个解决方法),那就是虽然您编写的 void 方法返回,但其他递归仍然从 ArrayList 索引(第 8 行)中删除元素,尽管返回了。我找到了一个解决方法(我在返回之前(在 if 下)向索引添加了 1000 个“abcdef”字符串,然后删除了它们(现在数量少于 1000 个,因为第 8 行删除了其中一些)在非无效方法中)。但从理论上讲,这可以在这里处理,还是应该从一开始就以不同的方式编写方法?
0赞 njzk2 3/28/2023
我不确定你的函数是什么,但它看起来是你应该有一个返回值来指示是否找到了连接(可以是布尔值,也可以是成功索引列表的不可变副本),如果不是这种情况,还有一种回溯的方法