12

可能重复:
如果不引用 Java 中的对象会发生什么情况,例如: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 都不会引发任何警告、错误或异常。原始返回类型也是如此。为什么?

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

我怎样才能从外壳解决这个问题?

4

4 回答 4

12

这就是语言的设计。

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

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

于 2012-05-28T10:11:13.730 回答
5

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

于 2012-05-28T10:10:09.237 回答
4

@CheckReturnValue您可以使用是否应始终使用其返回值来注释方法。像 FindBugs 这样的静态代码分析会考虑此注释并在您违反它时发出警告。

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

于 2012-05-28T10:12:30.713 回答
1

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

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

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

于 2012-05-28T10:12:27.503 回答