调用方法绝对没有任何作用?

时间:2014-12-14 23:09:26

标签: java arrays methods linked-list choice

所以现在我正在将一个数组程序转换为一个链接列表,用于我的最终作业。但是,当我尝试调用我的一个方法时,我遇到了一个问题。当用户在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");
    }
}

2 个答案:

答案 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块中运行它?