如何将OUT String参数传递给函数?像
public static Address getFromLocation (OUT string ErrorMsg) { ... }
如果在getFromLocation中发现一些错误,则该函数将更新ErrorMsg,以便以后使用。
如果不可能,在我的示例中,如何获取errorMsg?
答案 0 :(得分:1)
Java没有“ out”参数。
在Java中,有两种标准的方法可以做到这一点(报告错误):
抛出一个异常,可能是为此目的专门定义的类型,并带有异常中的详细信息。
非常好:返回一个对象,该对象具有地址属性和错误字符串属性;在成功的情况下,请填写地址并保留错误字符串null
;在错误的情况下,请填写错误字符串并保留地址null
。
将List<String>
或类似内容传递给方法(感谢a_horse_with_no_name进行提醒),并在错误情况下将其添加到列表中,返回{{ 1}} null
。
...或这些主题的各种变化。
#1和#3比#2更好。 #1提供结构化异常处理。 (例如,调用Address
的方法可以选择不处理该异常,而是记录它可能引发该异常,从而将错误处理留给调用者。)#3在您有很多方法时特别有用像这样,错误情况很常见(用户输入验证),并且您要提出一系列错误。
答案 1 :(得分:1)
使用Java的一种方式是:
public void foo(List<String> bar) { ...
但更合理:
public String foo() { ...
换句话说:
最后,真正的答案是:方法应该做一件事情。如果您的方法必须A)返回某个值,并且B)“返回”另一个值,则显然它在做两项事情,从而违反了Single Responsibility Principle。
答案 2 :(得分:1)
Java中没有out
参数,因此您必须通过添加额外的间接级别来模仿带有值传递的传递输出参数。
一种非常简单的方法是传递StringBuilder
-一个可变的对象,调用者可以对其进行修改:
public static Result getFromLocation(StringBuilder additionalInformation) {
...
// Method modifies the mutable object
additionalInformation.append("Some additional text");
...
}
呼叫者必须提供一个非空的StringBuilder
,如下所示:
StringBuilder info = new StringBuilder();
Result res = getFromLocation(info);
// Caller sees information inserted by the method
System.out.println(info);
在收到错误消息的情况下,更好的方法是引发一个已检查的异常。这样,您将能够提供超出范围的错误消息,并将错误处理与系统主要功能的代码完全分开:
class AddressRetrievalExcepion extends Exception {
...
}
public static Address getFromLocation() throws AddressRetrievalExcepion {
...
if (errorCondition) {
throw new AddressRetrievalExcepion("Cannot get address");
}
...
}
try {
Address addr = getFromLocation(error);
} catch (AddressRetrievalExcepion ae) {
System.out.println(ae.getMessage());
}