Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java null.equals(对象o)_Java_Object_Null - Fatal编程技术网

Java null.equals(对象o)

Java null.equals(对象o),java,object,null,Java,Object,Null,我知道在这样的空对象上调用equals方法是不可能的: //NOT WORKING String s1 = null; String s2 = null; if(s1.equals(s2)) { System.out.println("NOT WORKING :'("); } 但在我的例子中,我想比较两个数据库中的两个对象,这两个对象的属性可以

我知道在这样的空对象上调用equals方法是不可能的:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2))
            {
                System.out.println("NOT WORKING :'(");
            }
但在我的例子中,我想比较两个数据库中的两个对象,这两个对象的属性可以为null

那么,在我们不确定值是否为null或已填充的情况下,比较两个属性的方法是什么呢

这个方法好还是不好

//WORKING
            String s1 = "test";
            String s2 = "test";
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }

            //WORKING
            String s1 = null;
            String s2 = null;
            if(s1 == s2 || s1.equals(s2))
            {
                System.out.println("WORKING :)");
            }
我不确定,因为在这种情况下,它不起作用…:

//NOT WORKING
            String s1 = null;
            String s2 = null;
            if(s1.equals(s2)|| s1 == s2  )
            {
                System.out.println("NOT WORKING :'''(");
            }

当使用
s1
执行
s1.equals(s2)
时,出现NullPointerException的原因不是因为s2为null,而是因为您试图调用s1上的equals方法,该方法为null

试着这样修改它:

if(s1 != null && s1.equals(s2){ /*...*/ }

另外请注意,如果s1不为null,s2为null,您将从equals返回一个
false
,但没有NullPointerException。

在执行equals方法之前,您需要检查至少一个值不为null-

if(s1 == s2 || (s1!=null && s1.equals(s2)))  {
   System.out.println("WORKING :)");
} 
这里的
s1==s2
将在
null==null
的情况下工作。但如果一个也不是null,那么在执行equals之前至少需要检查s1

更新:
正如bernard paulus编辑的那样,如果您使用的是Java 7,则可以使用

我通常使用我编写的静态实用程序函数来解决此问题,该函数名为
equalsWithNulls

class MyUtils {
  public static final boolean equalsWithNulls(Object a, Object b) {
    if (a==b) return true;
    if ((a==null)||(b==null)) return false;
    return a.equals(b);
  }
}
用法:

if (MyUtils.equalsWithNulls(s1,s2)) {
  // do stuff
}
这种方法的优点:

  • 将完全相等测试的复杂性封装在单个函数调用中。我认为这比每次在代码中嵌入一堆复杂的布尔测试要好得多。因此,它不太可能导致错误
  • 使代码更具描述性,因此更易于阅读
  • 通过在方法名中显式地提到null,您可以向读者传达这样一个信息:他们应该记住一个或两个参数可能都是null
  • 首先进行(a==b)测试(这是一种优化,避免了在a和b不为null但引用完全相同的对象的情况下调用a.equals(b)的需要)

    • 我想你是在比较两个物体

      所以应该是这样

      if(s1==null & s2 == null)  // both null but equal
         return true;
      else if(s1 != null && s2 != null && s1.equals(s2)) // both not null and equal
         return true;
      else
         return false;
      
      正确-平等
      False-对于“不相等”

      如果您想知道某个内容是否为“空”,可以使用以下方法进行比较:

      if(s1==null)
      
      如果它是空的,它会告诉你是真的。问题是,如果字符串为null,则不能使用equals()方法。因此,第三部分不起作用,因为如果它等于,则不能使用空指针

      您应该首先检查对象是否为null,然后使用方法equals检查对象是否为null

      另一方面要小心,因为可能需要比较空字符串,在这种情况下,必须使用equal(“”)。如果要比较空字符串,最好以这种方式将空字符串放在第一位:

      "".equals(YourStringNotNull);
      

      对不起,我的英语对您有帮助。

      尝试使用org.apache.commons.lang中的ObjectUtils类

      public static boolean equals(java.lang.Object object1,
                               java.lang.Object object2)
      
      从api文档中

      比较两个对象是否相等,其中一个或两个对象可能为空

      ObjectUtils.equals(null,null)=true

      ObjectUtils.equals(null,“”=false

      ObjectUtils.equals(“,null)=false

      ObjectUtils.equals(“,”)=true

      ObjectUtils.equals(Boolean.TRUE,null)=false

      ObjectUtils.equals(Boolean.TRUE,“TRUE”)=false

      ObjectUtils.equals(Boolean.TRUE,Boolean.TRUE)=TRUE

      ObjectUtils.equals(Boolean.TRUE,Boolean.FALSE)=FALSE

      在null对象上调用点运算符(调用方法或对象属性)将始终抛出RuntimeException(Exception是静态成员,因为它们不属于对象,而是属于类)

      代码块之所以有效,是因为| |是一个快捷运算符:

       String s1 = null;
       String s2 = null;
       if(s1 == s2 || s1.equals(s2))
      
      如果左侧为真,则不计算右侧

      与&&相同:如果左侧为false,则不会计算右侧。

      另一个选项:

      Objects.equals(identification, criteria.getIdentification())
      

      此类由用于在上操作的静态实用程序方法组成 物体。这些实用程序包括空安全或空容忍方法 用于计算对象的哈希代码,返回对象的字符串 对象,并比较两个对象

      自: 1.7

      如果参数彼此相等,则返回true;如果参数为false,则返回false 否则。因此,如果两个参数都为null,则返回true 如果只有一个参数为null,则返回false。否则,, 相等性是通过使用第一个函数的相等方法来确定的 争论


      首先,不要将字符串与“==”运算符进行比较,始终使用
      equals(String anotherString)
      方法进行比较。“==”操作符不是用来比较字符串类型的。在我的例子中,我是用字符串来做这个例子的,但实际上我不会比较字符串:)不要认为你的问题很愚蠢。谢谢你的解决方案和解释。非常好的方法注意,因为Java 7这个方法是内置的:
      Objects.equals(obj1,obj2)
      如果
      s1
      为null,而
      s2
      为null,则仍将执行
      s1.equals(s2)
      并获得NullPointerException。
      Objects.equals(identification, criteria.getIdentification())