提问人:BlueInundation 提问时间:3/27/2023 最后编辑:BlueInundation 更新时间:3/27/2023 访问量:249
如果不满足某个条件,是否可以使用非 void 方法不返回任何内容
Is it possible to return nothing with a non-void method if a certain condition is not met
问:
如果某个条件不满足,有没有办法使用非 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;
}
答:
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
我不确定你的函数是什么,但它看起来是你应该有一个返回值来指示是否找到了连接(可以是布尔值,也可以是成功索引列表的不可变副本),如果不是这种情况,还有一种回溯的方法
评论
method()
method()