所以现在我正在将一个数组程序转换为一个链接列表,用于我的最终作业。但是,当我尝试调用我的一个方法时,我遇到了一个问题。当用户在ProcessChoice中选择选项3时(还有一个getChoice()方法),它会立即返回主菜单。这些是与该选择相关的方法。 DispItem()和FindItem()在另一个类中。 ProcessChoice()在用户类中。
void DispItem() {
ItemNode current = head;
current = FindItem();
if (current == null) {
System.out.println("\nThe item was not found.\n");
} else current.DispItem();
}
ItemNode FindItem() {
ItemNode current = head;
System.out.println("\nPlease enter the ID of the item you are looking for.\n");
int ID = keyboard.nextInt();
while (current != null) {
if (ID == current.GetItemID()) {
current.DispItem();
} else System.out.println("Error.");
}
return (current);
}
public static void ProcessChoice(int qChoice, InvenLL qMyAcct) {
if (qChoice == 1) {
qMyAcct.DispItems();
} else if (qChoice == 2) {
qMyAcct.AddItem();
} else if (qChoice == 3) {
qMyAcct.DispItem();
}
/*else if (qChoice == 4)
{
qMyAcct.ModifyItem();
}*/
else if (qChoice == 5) {
System.out.println("\nYou have exited the program. The item data will now be saved. Good bye!\n");
}
}
答案 0 :(得分:2)
代码的第一个问题是样式。这是应该的样子,使用 java 的编码约定:
void dispItem(){
ItemNode current = head;
current = findItem();
if(current == null){
System.out.println("\nThe item was not found.\n");
}
else current.dispItem();
}
ItemNode findItem(){
ItemNode current = head;
System.out.println("\nPlease enter the ID of the item you are looking for.\n");
int ID = keyboard.nextInt();
while(current != null){
if(ID == current.getItemID()){
current.dispItem();
}
else System.out.println("Error.");
}
return (current);
}
public static void processChoice(int qChoice, InvenLL qMyAcct){
switch(qChoice){
case 1:
qMyAcct.dispItems();
break;
case 2:
qMyAcct.addItem();
break;
case 3:
qMyAcct.dispItem();
break;
case 4:
qMyAcct.modifyItem();
break;
case 5:
System.out.println("\nYou have exited the program. The item data will now be saved. Good bye!\n");
break;
}
}
随着风格问题的解决,逻辑错误变得更加明显。程序中的逻辑错误就在这个循环中:
while(current != null){
if(ID == current.getItemID()){
current.dispItem();
}
else System.out.println("Error.");
}
如上所述,此循环永远不会终止,因为current
永远不会在循环内更新。
你可能想做这样的事情:
while(current != null){
if(ID == current.getItemID()){
current.dispItem();
}
else System.out.println("Error.");
current = current.next(); //or whatever function returns the next node.
}
然而,这仍然没有意义。 findItem
不应该打印错误或显示列表内容;它应该是找到项目而没有其他。这是将业务逻辑与应用程序逻辑混合的结果。
正确实现此类事情会使linkedlist
与菜单提示和内容完全分开。事实上,在现实世界中,人们根本不会实现链接列表 - 一个人会使用java.util.LinkedList
。我怀疑这不是一个选择,因为这是一项学校作业。但是,您可以执行下一个最好的操作,并使用java.util.AbstractSequentialList
。如果不允许,那么自己实现java.util.List,或者至少在该接口上设置链接列表实现的模式。除此之外,实现必要的菜单结构将是一个SMOP。
答案 1 :(得分:-1)
您在FindItem()中的while循环永远不会重新分配当前,似乎它将永远循环。你是否可以在try-catch块中运行它?