如何将OUT String参数传递给函数?

时间:2018-09-20 13:05:58

标签: java

如何将OUT String参数传递给函数?像

public static Address getFromLocation (OUT string ErrorMsg) { ... }

如果在getFromLocation中发现一些错误,则该函数将更新ErrorMsg,以便以后使用。

如果不可能,在我的示例中,如何获取errorMsg?

3 个答案:

答案 0 :(得分:1)

Java没有“ out”参数。

在Java中,有两种标准的方法可以做到这一点(报告错误):

  1. 抛出一个异常,可能是为此目的专门定义的类型,并带有异常中的详细信息。

  2. 非常好:返回一个对象,该对象具有地址属性和错误字符串属性;在成功的情况下,请填写地址并保留错误字符串null;在错误的情况下,请填写错误字符串并保留地址null

  3. 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() { ...

换句话说:

  • Java是按价值传递的
  • 所以您只能传递对String对象的引用
  • 但是String对象是不可变的!
  • 所以你不能通过参数退出
  • 您只能返回一个字符串
  • 或(丑陋的hack)传递“某种容器”(例如字符串列表),然后将字符串推入该容器对象。

最后,真正的答案是:方法应该做一件事情。如果您的方法必须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());
}