2012-10-01 32 views
1
public void returnRental(Customer cust){ 
    Rental toDelete = null; //Rental to be removed from list. 
    LinkedList<Video> toReturn = null; //List of videos to be added to inventory. 

    //Find appropriate rental according to customer name. 
    for(int i = 0; i < rentals.size(); i++){ 
     if(cust.getName() == rentals.get(i).getRentee().getName()){ 
      toReturn = rentals.get(i).getRented(); 
      toDelete = rentals.get(i); 
     } 
    } 

这是给我的问题的代码片段。我已经在eclipse中进行了相当多的调试,最终让我更加困惑。它击中了if,并且通过了条件。但是一旦它将值分配给“toReturn”,它将为它指定一个空的列表,大小为0.在检查我的租金时,链接列表和正确的值在那里,但由于某种原因,它没有正确地分配给我的变量: (“toDelete”也是一样,但这不是一个列表,它是我的Rental类的一个实例(链表是一个租借列表,其中包含一个链接的视频列表)Java没有正确地将值分配给我的变量,链接列表

没有错误抛出... 它有点难以解释,如果您需要了解更多信息,请让我知道,我会澄清。

我不知所措,可能是因为我没有通过我的链接列表遍历正确?

+0

如何知道它通过'if'条件? –

+0

@RohitJain因为它没有评估为null。 – 2012-10-01 19:44:13

+0

@pst ..你应该使用'equals()'方法来比较两个字符串..否则它永远不会进入你的if .. –

回答

1

我upvoted dystroy的答案,因为不正确的字符串比较永远是错的。

但是,因为这将失败不同的(客户名称不匹配rentee的名字),我想知道,如果你的问题是真正通过以下任一情况引起:

  1. getRented()一个问题;或
  2. cust在调用时有一个空名称,它将与一个空名称的Rentee相匹配。
3

更换

if (cust.getName() == rentals.get(i).getRentee().getName()){ 

通过

if (cust.getName().equals(rentals.get(i).getRentee().getName())){ 

你不能==比较字符串(除非您的算法可以保证这一点是相同的情况下,这几乎是从来没有的情况下)。

但缺少equals不是唯一的错误。它可能在getRented()或其他地方(你不会显示你如何使用toReturntoDelete,所以你不清楚这里是否有问题)。

现在,去追逐你的错误,你要么

  • 调试,并把一个断点在你的循环,如果你能”来检查在这一点上
  • rentals.get(i)状态和执行t调试,把很多System.println,让你知道你有什么...
+0

然而(虽然这是一个应该解决的问题); “但是一旦它将值分配给”toReturn“,它就会为其分配一个大小为0的空列表。”似乎很奇怪...... – 2012-10-01 19:44:46

+4

'你不能用==来比较字符串'你可以,而且你应该如果你想检查它们是否引用同一个对象,而不是如果你想比较它们的值,就像在这种情况下。 – MrLore

+0

@MrLore我加了精度,但我不确定现在对于一个新的程序员来说现在不会更混乱...... –

1

可能,您的if条件不止一次被击中。首先,检查这是否真的发生。如果是这样,检查你的逻辑,并确定是否要停止在第一次发生或最后(这种情况似乎是后者)。

如果你想停在第一次出现,打破了迭代:

for(int i = 0; i < rentals.size(); i++){ 
    if(cust.getName() == rentals.get(i).getRentee().getName()){ 
     toReturn = rentals.get(i).getRented(); 
     toDelete = rentals.get(i); 
     break; 
    } 
} 
+0

'break'对效率来说是一个很好的补充,但我不明白它是如何修复这个bug的。 –

+0

如果条件不止一次被触发,它将保存最后的发生。如果第一次if被击中的值是OK并且第二次被空值覆盖呢?这就是为什么我建议OP检查他的特定列表数据。 – Gamb

+0

我也尝试了休息,唉仍然没有帮助。 – DrizztDoUrden

0
for(int i = 0; i < rentals.size(); i++){ 
    if(cust.getName().equals(rentals.get(i).getRentee().getName())){ 
     toReturn.addAll(rentals.get(i).getRented()); 
     //assumming it returns the list of Video object 
     toDelete = rentals.get(i); 
    } 
} 
+0

getRented返回一个视频列表,正如他在他的问题中所述。用addAll替换add。这仍然不能解决toDelete的问题。 –

+0

@Jonathan:谢谢你指出。在那里我很困惑,所以留下了评论。 – Jimmy

相关问题