Java没有使用链表将值正确分配给我的变量

Java没有使用链表将值正确分配给我的变量,java,linked-list,loops,Java,Linked List,Loops,下面是给我带来问题的代码片段。我在eclipse中调试了很多次,结果让我更加困惑。它命中if,并通过条件。但一旦它开始给toReturn赋值,它就会给它分配一个大小为0的空列表。当我检查我的rentals链接列表时,正确的值在那里,但由于某些原因,它没有正确地分配给我的变量:toDelete也发生了同样的情况,但这不是一个列表,它是我的类Rental的一个实例。链接列表是租赁列表,其中包含视频链接列表 不会抛出任何错误。。。 这有点难以解释,如果你需要更多的信息,请让我知道,我会澄清 我不知所措

下面是给我带来问题的代码片段。我在eclipse中调试了很多次,结果让我更加困惑。它命中if,并通过条件。但一旦它开始给toReturn赋值,它就会给它分配一个大小为0的空列表。当我检查我的rentals链接列表时,正确的值在那里,但由于某些原因,它没有正确地分配给我的变量:toDelete也发生了同样的情况,但这不是一个列表,它是我的类Rental的一个实例。链接列表是租赁列表,其中包含视频链接列表

不会抛出任何错误。。。 这有点难以解释,如果你需要更多的信息,请让我知道,我会澄清

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

替换

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);
        }
    }

您不能将字符串与==进行比较,除非您的算法可以确保这是同一个实例,而这几乎从来都不是事实

但缺少的equals并不是唯一的bug。它可能在GetRened内部或其他地方,您没有展示如何使用toReturn和toDelete,因此不清楚您在这里是否没有问题

现在,要继续追踪你的虫子,你应该

调试,并在循环中放置断点,以检查rentals.geti的状态以及此时的执行情况 如果无法调试,请放入大量System.println,以便了解您拥有的。。。 替换

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);
        }
    }

您不能将字符串与==进行比较,除非您的算法可以确保这是同一个实例,而这几乎从来都不是事实

但缺少的equals并不是唯一的bug。它可能在GetRened内部或其他地方,您没有展示如何使用toReturn和toDelete,因此不清楚您在这里是否没有问题

现在,要继续追踪你的虫子,你应该

调试,并在循环中放置断点,以检查rentals.geti的状态以及此时的执行情况 如果无法调试,请放入大量System.println,以便了解您拥有的。。。 可能,您的if条件被多次击中。首先,检查这是否真的发生了。如果是这样,请检查您的逻辑并确定您是希望在第一次发生时停止,还是在最后一次发生时停止。这种情况似乎是后者

如果要在第一次出现时停止,请中断迭代:

if (cust.getName().equals(rentals.get(i).getRentee().getName())){
可能,您的if条件被多次击中。首先,检查这是否真的发生了。如果是这样,请检查您的逻辑并确定您是希望在第一次发生时停止,还是在最后一次发生时停止。这种情况似乎是后者

如果要在第一次出现时停止,请中断迭代:

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

我对dystroy的答案投了赞成票,因为不正确的字符串比较总是错误的

但是,由于客户名称与承租人名称不匹配会导致不同的失败,我想知道您的问题是否真的是由以下任一原因引起的:

租赁中的一个问题;或 呼叫时具有空名称的客户,这将匹配具有空名称的承租人。
我对dystroy的答案投了赞成票,因为不正确的字符串比较总是错误的

但是,由于客户名称与承租人名称不匹配会导致不同的失败,我想知道您的问题是否真的是由以下任一原因引起的:

租赁中的一个问题;或 呼叫时具有空名称的客户,这将匹配具有空名称的承租人。
您如何知道它通过了if条件???@RohitJain,因为它的计算结果不是null。@pst。。您应该使用equals方法来比较两个字符串。。否则它将永远不会进入你的if..@RohitJain我并不反对,但是:一旦它开始给toReturn赋值,它就会给它分配一个大小为0的空列表。。因此,要么OP是错误的,要么if是被执行的,不管条件多么粗略。我有另一个假设:条件是真的。。多次且最后一次分配仍保持不变-我猜你刚开始上编程课。这里有一个小贴士将在将来很好地为您服务:每当您发现自己说Java不是,你应该说我不是……你怎么知道它通过了if条件???@RohitJain,因为它的计算结果不是null。@pst。。您应该使用equals方法来比较两个字符串。。否则它将永远不会进入你的if..@RohitJain我并不反对,但是:一旦它开始给toReturn赋值,它就会给它分配一个大小为0的空列表。。因此,要么OP是错误的,要么if是被执行的,不管条件多么粗略。我有另一个假设:条件是真的。。多次且最后一次分配仍保持不变-我猜你刚开始上编程课。这里有一个小贴士将在将来很好地为您服务:每当您发现自己说Java不是,你应该说我不是……然而,尽管这是一个应该解决的问题;但一旦它开始给toRetu赋值
rn it为其分配一个大小为0的空列表。似乎很奇怪..不能将字符串与==进行比较。如果您想检查它们是否引用相同的对象,您可以这样做,而且您应该这样做,但如果您想像本例中那样比较它们的值,则不必这样做。@MrLore我添加了精度,但我不确定现在对于新程序员来说它是否更令人困惑……除非他在应用程序中使用新字符串创建每个字符串……,否则使用==将与等于一样有效。请参见问题和链接问题中的我的评论。如果可以的话,我会投反对票,因为这个答案根本不能回答这个问题,因为提供的信息表明变量toReturn不是空的,所以条件是匹配的;但一旦它开始给toReturn赋值,它就会给它分配一个大小为0的空列表。似乎很奇怪..不能将字符串与==进行比较。如果您想检查它们是否引用相同的对象,您可以这样做,而且您应该这样做,但如果您想像本例中那样比较它们的值,则不必这样做。@MrLore我添加了精度,但我不确定现在对于新程序员来说它是否更令人困惑……除非他在应用程序中使用新字符串创建每个字符串……,否则使用==将与等于一样有效。请参见问题和链接问题中的我的评论。如果可以的话,我会投反对票,因为这个答案根本不能回答这个问题,因为提供的信息表明变量toReturn不是空的,所以条件是匹配的。break是一个提高效率的好方法,但我不知道它如何修复这个错误。如果条件被多次击中,它将保存最后一次发生的情况。如果第一次命中if时,值正常,第二次被空值覆盖,该怎么办?这就是为什么我建议OP检查他特定的列表数据。@user1712761我明白了。。。拜托,你能把你用的名单贴出来吗?这可能会解释为什么会发生这种情况。break是一个提高效率的好方法,但我不知道它如何修复该错误。如果该条件被多次命中,它将保存上次发生的情况。如果第一次命中if时,值正常,第二次被空值覆盖,该怎么办?这就是为什么我建议OP检查他特定的列表数据。@user1712761我明白了。。。拜托,你能把你用的名单贴出来吗?这或许可以解释为什么会发生这种情况。正如他在问题中所说,GetRened返回一个视频列表。用addAll替换add。这仍然不能解决托德莱特的问题。@乔纳森:谢谢你指出这一点。我有点困惑,所以在这行之后留下了评论。GetRendered返回一个视频列表,正如他在问题中所说的。用addAll替换add。这仍然不能解决托德莱特的问题。@乔纳森:谢谢你指出这一点。我有点困惑,所以在这行之后留下了评论。
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); 
    } 
}