2013-10-20 15 views
0

在Java中,如果方法定义返回某个东西,那么调用该方法的类必须准备将该方法的返回值捕获到变量中。至少这就是我理解的逻辑。但我有一个奇怪的情况,编译器不抱怨。在java中,我期望返回一个必须捕获的值的方法调用不会引发编译错误。为什么?

我有一个动物界面与定义的方法。实现Animal接口的AnimalImpl类,以及使用组合作为Animal类型的实例变量的Lion类。

这是代码。为什么编译器不会疯狂?

接口:

public interface Animal { 
    public int walk(int steps); 
    public int fly(int miles); 
    public void eat(String food); 
} 

实现:

public class AnimalImpl implements Animal { 
    @Override 
    public int walk(int steps) { 

     return steps * 100; 
    } 
    @Override 
    public int fly(int miles) { 
     return miles/5; 
    } 
    @Override 
    public void eat(String food) { 
     System.out.println("Animal ate food: "+food); 

    } 
} 

客户:

public class Lion { 
    private Animal ani; 
    public String executeAnimalMethod(){ 
     ani = new AnimalImpl(); 
     ani.eat("carrots"); 
     ani.walk(100); 
     ani.fly(100); 
     return null; 
    } 
} 

如何才能补偿梅勒不会抛出一个错误?为什么会这样?

+0

编译错误不会被抛出,它们会被打印出来。 – EJP

+1

在Java中(如C),忽略方法调用的返回值是完全合法的。 –

回答

4

使用从方法返回的值不是语言要求。

这种情况发生的常规和频繁,如:

Set<Integer> set = new HashSet<Integer>(); 
set.add(1); // returned boolean ignored 

Set#add()返回指示一个布尔值,如果设置被更改为与给定参数(调用它的结果,如果设定已经包含返回false值),但大多数情况下,返回的值将被忽略,如代码片段所示。

1

您不必在变量中存储返回值。只是因为它返回并不意味着你必须保持它。

0

编译器没有错误,因为你写的所有东西都是合法的java。

你没有在你的问题中说明你认为编译器应该错误的地方。不知道更多,我可以假设你认为只是因为方法有一个返回类型,该方法的调用者必须将它分配给某些东西。 Java根本不强制执行 - 类的客户端可能会调用方法并完全忽略其合法返回值。

0

我不得不说,我从来没有见过有人因此而心烦而不是得到错误。

首先,Java不会强制您捕获从方法返回的值。

其次,并不是所有的Java方法甚至都返回一个值。有些是void

它只是发生,你经常需要捕获返回值做其他事情,但你不必。

别担心。如果你和我一样,你的编译器和你的运行时日志将很快就会疯狂。享受它,而它持续。

+0

谢谢我是这个整个编译语言世界的新手。我来自脚本语言背景。谢谢 –

+0

乐于帮助。请注意,虽然可以争论优点,但不从Python或Ruby函数捕获结果也是合法的。与Java的区别在于它们的函数总是返回一些东西(Python中为None,Ruby中为零)。 – Vidya

相关问题