从方法返回“void”或“null”

时间:2013-01-22 14:48:55

标签: java c++ c methods return-value

这里我有几个问题:

1)我试图从方法中返回null值,类似于此(仅当TypeCasted进入对象时):

 public static Object returns()
{
   return (Object)null ;
}

并存储了对象:

 ...main()..{
 Object obj=  returns();
 ...}

当我检查时:

  if( obj.equals(obj))

扔了NullPointerException

但是,

 if(null==null)
 System.out.println("works");

编译并给出了正确的输出。这有什么理由吗?

2)另外,当我尝试时:

 public static Object returns()
{
  return (Object)void ;
}

给我Syntax Error。有什么理由吗?

3)C/C++或其他任何OO语言中的这种行为会有所不同吗?

3 个答案:

答案 0 :(得分:2)

您无法在equals上致电null,而应使用==。请注意,调用==equals并不相同。 ==比较引用,而equals是按惯例比较的方法。由于null对象没有值,因此没有任何意义。

Void不是任何语言的值,因此无法将其转换为任何内容(在本例中为Object)。

在C ++中返回NULL,你必须返回一个指针。要比较返回的对象,您必须键入以下内容:

 if( *obj == *obj)

再次这将失败,因为obj为NULL。在我知道的任何语言中,你必须在比较之前对null进行显式检查。

编辑:想一想你尝试过的ruby

答案 1 :(得分:1)

1)

if(obj.equals(obj))

默认的equals实现只是使用==来检查两个对象(实际上是两个引用)是否实际上是指内存中的同一个对象,但它仍然是一个调用一个实例方法,如果通过NullPointerException调用,则绑定失败null

 if(null==null)

反而没有给出任何问题,因为你没有调用任何实例方法,你只是在比较地址。

2)void只是用于标记函数的关键字 1 ;尝试归还它没有任何意义。相反,null将对象引用标记为什么都没有,这是一个完全不同的概念。

3)在C ++中没有默认的“equals”方法,整个对象模型基于值类型(在Java中,您通常使用对象的引用),因此很难做一个精确的比较。 2

在C ++中,一个对象(或引用)保证是一个“有效”对象(=为它分配了空间并且构造函数已经运行),因此不可能得到一个假设在对象上调用实例方法时等效于NullPointerException

另一方面,完全可以使用{em>指针 NULL,在这种情况下,如果你尝试取消引用它,你会进入未定义的行为(通常是崩溃)以某种方式(例如通过*-> 3

对于等式检查:默认情况下没有实现对象的==运算符,因此只有当类的实现者实际为operator==写了一个重载时才比较对象的相等性。对于指针,==运算符由语言本身提供(并且不能被覆盖),它实际上比较了这两个地址。


  1. 与C和C ++相比,void被认为是一种类型(特别是“一种无法完成的不完整类型”),在Java it's not中,虽然在某些方面它可以是被视为这样。
  2. 在C中没有类别或方法 period - 它不是OO语言;但是,以下大部分讨论都适用于struct并访问其字段。
  3. 虽然......如果实例方法不是virtual并且不使用对象的任何字段(= this指针没有以任何方式解除引用),在大多数实现中你可以在NULL指针上调用实例方法。此外,通过“正式解除引用”指针,您可以创建一个“空引用”,这可能会在使用时引起麻烦。但在这两种情况下,它仍然是未定义的行为 - 即它不正确,尽管通常不执行预防性检查,有利于执行严格的规则执行。

答案 2 :(得分:0)

(Object)null为null,这意味着您不能使用任何方法,因为它不存在。

至于语法错误,在Java void中是一个类型,而不是一个值,因此您无法返回void