【问题标题】:Why isn't it necessary to assign a method's return value to a variable? [duplicate]为什么不需要将方法的返回值分配给变量? [复制]
【发布时间】:2012-06-02 17:05:59
【问题描述】:

可能重复:
what happens to an object in Java if you do not reference it, like here : myString.concat(“that”)

public class ReturnTest
{
    public static void main(String[] args)
    {
        ReturnTest rt = new ReturnTest();
        rt.show();
    }

    public String show()
    {
        return "Hello";
    }
}

在上面的代码中,show() 方法返回一个未被任何变量捕获的String 值。编译器和 JVM 都不会引发任何警告、错误或异常。原始返回类型也是如此。为什么?

编译器不应该确保方法返回的重要值不会因此丢失吗?

如何从 shell 解决这个问题??

【问题讨论】:

  • 如果您将值分配给变量但不检查它怎么办?如果您确实检查了它,但没有根据该检查做出“正确”的决定怎么办?在编译器做“正确”的事情之前,你想走多远?

标签: java return-value


【解决方案1】:

因为你不一定需要返回值。

【讨论】:

  • 我的问题是java是如何认为我们不需要返回值的?
  • 它没有。它只是没有分配。
  • 假定程序员知道他们在做什么。如果他们不存储返回的值,他们就不需要它。
  • 如果他们不需要返回值,他们可以通过将返回值强制转换为 (void) 来使其明确。
【解决方案2】:

这是语言的设计。

在许多情况下,方法会返回一个您不关心的值。例如StringBuilder.append() 返回对象本身。

确实在某些情况下可能会丢失重要的返回值。例如,InputStream.skip(long n) 返回跳过的字节数。 read 返回读取的字节数。有一些工具(CheckstyleFindBugs)可以检测到此类错误。但是语言本身并不要求检查返回值。即使是这样,程序也可以选择忽略该值。

【讨论】:

  • 我没有使用任何 IDE,如何通过 shell 解决这个问题??
  • 您可以在命令行上或作为构建的一部分运行 Checkstyle 和 FindBugs。但是,为什么不直接使用 IDE?
【解决方案3】:

Java 中的函数不是纯函数,因此它们可能只是为了副作用而运行。只是在这种情况下没有副作用......考虑

public String show() {
    System.out.println("Hello");
    return "Hello";
}

现在你想要一个警告吗?编译器不知道你是因为副作用还是价值而运行它,所以为什么要坚持呢?

【讨论】:

    【解决方案4】:

    如果应该始终使用返回值,您可以使用@CheckReturnValue 注释方法。像 FindBugs 这样的静态代码分析会考虑这个注解,并在您违反它时发出警告。

    至少当方法返回某种需要在调用者负责的末尾进行最终处理的对象时,这是非常合理的。这对于必须在最后关闭的资源是正确的。最后必须释放的锁...

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      相关资源
      最近更新 更多