Java 空赋值行为

Java 空赋值行为,java,eclipse,Java,Eclipse,我的日期格式会根据某些条件进行更改,为了具有全局访问权限,我会初始化它们,然后根据条件指定一个值 但在DeBugger看来,这些值并没有被重新分配,它们在初始化时仍然为空 我是java新手,导致这种情况的赋值行为是什么 以下是代码: SimpleDateFormat df = null; SimpleDateFormat df2 = null; SimpleDateFormat date_c = null; SimpleDateFor

我的日期格式会根据某些条件进行更改,为了具有全局访问权限,我会初始化它们,然后根据条件指定一个值

但在DeBugger看来,这些值并没有被重新分配,它们在初始化时仍然为空

我是java新手,导致这种情况的赋值行为是什么

以下是代码:

SimpleDateFormat df     = null;
        SimpleDateFormat df2    = null;
        SimpleDateFormat date_c = null;
        SimpleDateFormat t      = null;
        SimpleDateFormat t2     = null;
        SimpleDateFormat df5    = null;
        SimpleDateFormat df3    = null;

        if ( make == "NCR")
        {
        df     = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        df2    = new SimpleDateFormat("yyyyMMddHHmmss");
        date_c = new SimpleDateFormat("yyyyMMdd");
        t      = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        t2     = new SimpleDateFormat("yyyyMMddHHmmss");
        df5    = new SimpleDateFormat("yyyyMMddHHmmss");
        df3    = new SimpleDateFormat("yyyyMMddHHmmss");
        }

        else if ( make == "WINCORE")
        {
            df     = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
            df2    = new SimpleDateFormat("yyyyMMddHHmmssS");
            date_c = new SimpleDateFormat("yyyyMMdd");
            t      = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
            t2     = new SimpleDateFormat("yyyyMMddHHmmssS");
            df5    = new SimpleDateFormat("yyyyMMddHHmmssS");
            df3    = new SimpleDateFormat("yyyyMMddHHmmssS");
        }

因为这两个条件都不满足。您使用
==
进行字符串比较,这很可能是一个错误<代码>=比较对象标识,字符串是对象。对于基于值的比较,您应该使用
equals
。将literal放在左边可以进行
null
安全的比较(这是一种常见的Java习惯用法):
“NCR”.equals(make)
。但是如果
make
不是
null
或者您想要
NullPointerException
用于
null
make
,您也可以使用
make.equals(“NCR”)

比较以下各项:

assert "NCR" == "NCR" : "String literals are interned, so they have the same identity";
assert "NCR" != new String("NCR") : "String with the same value but not the same identity"; 
assert "NCR".equals(new String("NCR")) : "But they are equal";

因为这两个条件都不满足。您使用
==
进行字符串比较,这很可能是一个错误<代码>=比较对象标识,字符串是对象。对于基于值的比较,您应该使用
equals
。将literal放在左边可以进行
null
安全的比较(这是一种常见的Java习惯用法):
“NCR”.equals(make)
。但是如果
make
不是
null
或者您想要
NullPointerException
用于
null
make
,您也可以使用
make.equals(“NCR”)

比较以下各项:

assert "NCR" == "NCR" : "String literals are interned, so they have the same identity";
assert "NCR" != new String("NCR") : "String with the same value but not the same identity"; 
assert "NCR".equals(new String("NCR")) : "But they are equal";

在java中比较字符串时,不使用
==
,而是使用
equals()



另外,将字符串文字放在第一位,如果
make
null
,那么在java中比较字符串时不会得到
NullPointerException

,您不使用
==
,而是使用
equals()



另外,将字符串文字放在第一位,以防
make
null
,因此不会出现
NullPointerException

的可能重复项。如果您真的通过此方法进行调试,则不会看到任何一个分支被执行,这表明它与赋值无关,还有所有与字符串相等比较有关的内容。我不明白为什么需要所有这些日期格式。创建7个实例,而4个就可以了。我会让它们都是静态的&最终的;我还将lenient设置为false for all。@duffymo我可以看出它在可修改性方面的必要性-如果您想更改其中一个,只需在此处更改它,而不必为它创建新变量,因为只有4个变量。但是,只需将一种格式分配给另一种格式就可以了,即
t2=df2
(除非这是您的意思)。我只需为每种格式创建一种DateFormat并重用它。如果我想要一个新的,我会创建它。可能的副本如果你真的通过这个调试,你会看到两个分支都没有被执行-这表明它与赋值无关,与字符串相等性比较有关。我不明白你为什么需要所有这些日期格式。创建7个实例,而4个就可以了。我会让它们都是静态的&最终的;我还将lenient设置为false for all。@duffymo我可以看出它在可修改性方面的必要性-如果您想更改其中一个,只需在此处更改它,而不必为它创建新变量,因为只有4个变量。但是,只需将一种格式分配给另一种格式就可以了,即
t2=df2
(除非这是您的意思)。我只需为每种格式创建一种DateFormat并重用它。如果我想要一个新的,我会创建它。请使用
make.equals(“NCR”)
而不是相反的方法(除非
make
可以
null
)。我们不使用
1==i
或说
1等于i
,这与这样做是一样的。当使用“==”比较两个字符串时,Java不会比较这些字符串的值,而是比较它们的标识。如果您想比较它们的值,请使用make.equals(“WINCORE”),这取决于您如何定义make。如果将make定义为'String make=“NCR”`然后'make==“NCR”`将返回true@Dukeling在我看来,“NCR.equals”(make)比make.equals(“NCR”)好。因为
make.equals(“NCR”)
可以抛出
NullPointerException
“Yoda”编码。这是一个古老的C/C++习惯用法。我认为在使用静态字符串时这样做是有意义的。请使用
make.equals(“NCR”)
而不是相反的方法(除非
make
可以
null
)。我们不使用
1==i
或说
1等于i
,这与这样做是一样的。当使用“==”比较两个字符串时,Java不会比较这些字符串的值,而是比较它们的标识。如果您想比较它们的值,请使用make.equals(“WINCORE”),这取决于您如何定义make。如果将make定义为'String make=“NCR”`然后'make==“NCR”`将返回true@Dukeling在我看来,“NCR.equals”(make)比make.equals(“NCR”)好。因为
make.equals(“NCR”)
可以抛出
NullPointerException
“Yoda”编码。这是一个古老的C/C++习惯用法。我认为当你有一个静态字符串时,这样做是有意义的。