Java 空赋值行为
我的日期格式会根据某些条件进行更改,为了具有全局访问权限,我会初始化它们,然后根据条件指定一个值 但在DeBugger看来,这些值并没有被重新分配,它们在初始化时仍然为空 我是java新手,导致这种情况的赋值行为是什么 以下是代码:Java 空赋值行为,java,eclipse,Java,Eclipse,我的日期格式会根据某些条件进行更改,为了具有全局访问权限,我会初始化它们,然后根据条件指定一个值 但在DeBugger看来,这些值并没有被重新分配,它们在初始化时仍然为空 我是java新手,导致这种情况的赋值行为是什么 以下是代码: SimpleDateFormat df = null; SimpleDateFormat df2 = null; SimpleDateFormat date_c = null; SimpleDateFor
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++习惯用法。我认为当你有一个静态字符串时,这样做是有意义的。