为什么或为什么不使用instanceof来检查是否为null

时间:2015-05-08 13:51:28

标签: java android

我只是想知道何时使用!= null代替instanceof检查某些内容是否为空是否有充分的理由或做法。

使用instanceof测试某些内容是否为空是不好的做法?

例如:

View view = ((Activity) context).findViewById(viewID);
                                if (view instanceof  View) {
                                    listener.onView(view, viewID);
                                }

View view = ((Activity) context).findViewById(viewID);
                            if (view != null) {
                                listener.onView(view, viewID);
                            }

它的运作方式是否同样如此?

4 个答案:

答案 0 :(得分:3)

这取决于你实际检查的内容

  • 如果您只是想知道引用是null,请使用x == null而不是其他
  • 如果您想知道特定引用是否不是null并指向Foo类型的实例,您可以使用x instanceof Foo,因为它意味着不是{{1} }}

    但是如果引用的编译时类型已经是null,那么当知道实例为非Foo时,您知道该实例的类型为Foo,因此第一个项目符号适用在这种情况下;你只想测试null。在更新的问题示例中就是这种情况,引用已经具有编译时类型null

  • 如果您想知道类型广告View是否会成功,您可以使用(Foo)x,因为当x == null || x instanceof Foox时类型广播也会成功(但是,你应该三思而后行,是否真的想接受null s,即使类型转换成功也是如此)

答案 1 :(得分:0)

instanceof之前根本不需要空检查。 如果它为null,那么在检查instanceof期间它将返回false。

使用instanceof测试某些内容是否为空是不好的做法?

在运行时,当你不确定它是否为null时。只需使用instanceof它就会在null对象的情况下返回false。

答案 2 :(得分:0)

  

我只是想知道是否有充分的理由或做法何时使用!= null而不是instanceof来检查某些东西是否为空。

当然有一个原因,!=null可以应用于Java中的所有对象,但instanceof不能应用于原始类型,它只检查给定对象是否是类的实例这就是我们使用!=null来检查无效的原因。

  

用instanceof测试某些东西是否为空是不好的做法?

您可以使用它,但是如果它可能会导致原始类型出现问题并且instanceof可以应用于所有对象,那么为什么要使用!=null

修改

在您使用if (view instanceof View)的情况下更安全,因为您使用它来测试它是否是View的实例,并且如果它不是null则同时进行测试。

正如您在“Here”中看到的那样,您可以看到您可以使用instanceof来检查无效。

答案 3 :(得分:0)

$idUser = (int)$this->getRequest()->getParam( 'idUser' ); $user = new Admin_Model_DbTable_User(); $rankuser=Admin_Models_UserTools::getRankByIdUser($idUser); //var_dump($rankuser); //die(); if(($rankuser!== 0)||($rankuser!==3)){ $nbDeleteRows = $user->delete( array ("idUser = ?" => $idUser) ); if( $nbDeleteRows === 0) { echo json_encode(array( "response" => "false", "errorMessage" => "Il y a eu une erreur lors la suppression de l'utilisateur." )); exit(); }else{ echo json_encode(array( "response" => "true", "message" => "Il y a eu ". $nbDeleteRows ." utilisateur(s) supprimé(s)." )); exit(); } } 指令用于检查对象是否是某个类的实例。

因此,使用它来检查空值根本就没有意义......

在您的代码段中,您正在检查两个不同的内容:

  • 在第一个中,您正在检查您的对象是否是instanceof class
  • 的实例
  • 在第二个中,您正在检查对象是否已初始化

所以他们不是两种做同样事情的方法......

看看:use of "Instance of" in java