2015-10-04 61 views
-2

我已经重写了类Object的toString方法,但我的工作不正常,我找不出原因。这里是我的方法的代码(在一个名为ShoppingBag类):我可以不做System.out.println(Item.toString());?

public String toString(){ 
    String str = ""; 
    Item temp = record; 
    str += "\n\nThe bag contains:\n"; 
    str += String.format("%-18s%-13s%-12s\n", "Name of the Items", "Quantity", "Subtotal"); 
    while(temp != null){ 
     str += String.format("%-18s%-13s%-12s\n", temp.getItemName(), temp.getQuantity(), 
      "$"+(temp.getRetailPrice()*temp.getQuantity())); 
    } 
    str += String.format("%-18s%-13s%-12s\n", "", "Total:", "$"+this.totalCost()); 
    str += String.format("%-18s%-13s%-12s\n", "", "Tax(5%):", "$"+(this.totalCost() 
      * taxRate)); 
    str += String.format("%-18s%-13s%-12s\n", "", "Grand Total:", "$"+this.totalCost() 
      +(this.totalCost()*taxRate)); 
    String test = "test1"; 
    return test; 
} 

我知道,那里面有很多垃圾的一类项目和的String.format。编译或运行时没有例外,它只是不打印任何东西。

在我的申请,我试试这个:

ShoppingBag bag = new ShoppingBag(parameters); 
System.out.println(bag.toString()); 

并没有什么打印。当我注释掉除了我的方法的最后两行(String test = "test1"; return test;)以外的所有内容时,它会打印“test1”,但其他文本块不应该影响测试变量,所以我不明白为什么它不会打印。

+4

什么时候'临时'有空'? –

+1

你滥用'toString()'。该方法主要供开发人员在调试时使用。这不是将购物袋的内容打印给用户。为此,您应该有一个'print'方法,它将'PrintWriter'作为参数。这样编写者可以将输出直接传输到目标(文件或网络客户端)。 'toString()'方法应该简洁明了,只需要足够的摘要信息来在调试时区分多个行李。 – Andreas

+0

总是显示不起作用的代码。我们如何知道你实际上在你的非功能代码中返回'str'?你会惊讶这种愚蠢的错误发生的频率。 –

回答

5

没有打印,因为你陷入了无限循环;这一个:

while(temp != null){ 
    str += String.format("%-18s%-13s%-12s\n", temp.getItemName(), temp.getQuantity(), "$"+(temp.getRetailPrice()*temp.getQuantity())); 
} 

temp从未null所以你永远摆脱这一循环。

这就是为什么当你删除这些行,它开始工作(你删除无限循环)。你应该删除那个while循环。您可能意思是代替if声明(以避免NullPointerException)。回顾一下,您可能的意思是if (temp != null)而不是while (temp != null)tutorial on while声明,tutorial on if声明)。

另外,考虑使用StringBuilder而不是所有的字符串连接。

+0

啊!谢谢,我忘了1行:0​​ temp = temp.getLink();这将temp分配给LinkedList中的下一个变量。 – umbrahunter

相关问题