针对空对象意外行为的Java检查
我试图理解Java代码中的一些意外行为 代码如下:针对空对象意外行为的Java检查,java,debugging,logic,Java,Debugging,Logic,我试图理解Java代码中的一些意外行为 代码如下: TimeclockEntry t = db.getLastTimeclockEntryByEmployee(Integer.parseInt(employee)); String status = (t==null?"IN":t.getStatus()); if (operation != null) confirmation = getString(R.string.ttsJobIn); else confirmation =
TimeclockEntry t = db.getLastTimeclockEntryByEmployee(Integer.parseInt(employee));
String status = (t==null?"IN":t.getStatus());
if (operation != null)
confirmation = getString(R.string.ttsJobIn);
else
confirmation = getString(R.string.ttsClockIn);
if(t!=null) {
if(status=="IN") {
status = "OUT";
in = "false";
if (operation != null)
confirmation = getString(R.string.ttsJobOut);
else
confirmation = getString(R.string.ttsClockOut);
}
}
db.addTimeclockEntry(new TimeclockEntry(Integer.valueOf(employee), now, status));
变量“status”保存用户状态的文本表示。在这个逻辑中,我所做的就是交换一个自动超时功能(所以in变为OUT,反之亦然)。在这里,我将对照“IN”检查status的值,如果为true,我希望交换值
但是,当status等于“IN”时,代码不会执行(我正在使用Eclipse调试器进行验证,我观察status的值,它是“IN”,我在任何地方都设置了断点,它完全跳过if语句的内部)
我不明白发生了什么事。我将尝试附加调试过程的图像,以显示当status为“IN”时会发生什么,以及它如何完全跳过if子句
会发生什么?我最初有--if(t!=null&&status==“IN”),但注意到了这种行为,所以我拆分了if语句,没有任何帮助
状态检查、调试值
此图显示执行if语句时的状态值。在它周围设置断点,并且应该执行if语句中的代码(将status的值从“IN”更改为“OUT”)
状态检查,不可能值
此图显示调试器跳转到的行(似乎)不可能的status值(不是跳入if语句,而是跳转到if语句之后)。在这种情况下,t不为null,status等于“In”,因此if语句中的代码应该将status的值更改为“OUT”,但在断点处仍然设置为“In”
比较字符串时始终使用.equals
if("IN".equals(status)) {
看看这是否有帮助:)在比较字符串时始终使用.equals
if("IN".equals(status)) {
看看这是否有帮助:)在比较字符串时始终使用.equals
if("IN".equals(status)) {
看看这是否有帮助:)在比较字符串时始终使用.equals
if("IN".equals(status)) {
看看这是否有帮助:)
==
因为java中的字符串并不像您想象的那样工作;)改用.equals()
。这样就可以了,谢谢。我知道字符串是对象,就像java中的大多数东西一样,我使用“==”来避免空引用异常。我只需要先添加null检查。==
在java中对字符串的检查并不像您想象的那样;)改用.equals()
。这样就可以了,谢谢。我知道字符串是对象,就像java中的大多数东西一样,我使用“==”来避免空引用异常。我只需要先添加null检查。==
在java中对字符串的检查并不像您想象的那样;)改用.equals()
。这样就可以了,谢谢。我知道字符串是对象,就像java中的大多数东西一样,我使用“==”来避免空引用异常。我只需要先添加null检查。==
在java中对字符串的检查并不像您想象的那样;)改用.equals()
。这样就可以了,谢谢。我知道字符串是对象,就像java中的大多数东西一样,我使用“==”来避免空引用异常。我只需要先添加null检查。你是对的,但只是为了给你的答案提供一些背景信息:OP应该使用equals
的原因是,在Java中,字符串存储为对象,=
操作符比较对象引用而不是它们的值<另一方面,code>equals是用于比较String
对象值的方法。此解决方案允许我避免检查状态是否为null(status.equals(“IN”)可能会抛出null)。谢谢。大家注意到:)这就是我把它放在这个例子中的原因。你是对的,但只是为你的答案提供了一些背景知识:OP应该使用等于的原因是,在Java中,字符串存储为对象,=
操作符比较对象引用而不是它们的值<另一方面,code>equals
是用于比较String
对象值的方法。此解决方案允许我避免检查状态是否为null(status.equals(“IN”)可能会抛出null)。谢谢。大家注意到:)这就是我把它放在这个例子中的原因。你是对的,但只是为你的答案提供了一些背景知识:OP应该使用等于的原因是,在Java中,字符串存储为对象,=
操作符比较对象引用而不是它们的值<另一方面,code>equals
是用于比较String
对象值的方法。此解决方案允许我避免检查状态是否为null(status.equals(“IN”)可能会抛出null)。谢谢。大家注意到:)这就是我把它放在这个例子中的原因。你是对的,但只是为你的答案提供了一些背景知识:OP应该使用等于的原因是,在Java中,字符串存储为对象,=
操作符比较对象引用而不是它们的值<另一方面,code>equals
是用于比较String
对象值的方法。此解决方案允许我避免检查状态是否为null(status.equals(“IN”)可能会抛出null)。这就是为什么我把它放在这个例子中。