2014-12-14 3 views
1

Так что прямо сейчас я конвертирую программу массива в связанный список для моего окончательного назначения. Однако я столкнулся с проблемой при попытке вызвать один из моих методов. Когда пользователь выбирает параметр 3 в ProcessChoice (также есть метод 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"); 
    } 
} 
+1

Отладить его. Что происходит? – Kon

+0

Мы ничего не сделали с отладкой по всему классу. Я не знаю, с чего начать. – SeanDiablo

+0

Ну текущее, из того, что я понимаю о связанных списках, будет начинаться во главе и проходить через многие предметы, чтобы найти правильный. Я мог быть совершенно неправ, я чувствую, что меня бросили на акул. – SeanDiablo

ответ

-1

Ваш цикл while внутри FindItem() никогда не переназначает текущий, похоже, что он будет работать навсегда. Возможно, вы запускаете это внутри блока try-catch?

+0

Почему это имеет значение, если он работает внутри try-catch? И это должен быть комментарий, а не ответ. –

+0

Это не работает ни в какой попытке. Как я могу переназначить ток? – SeanDiablo

+0

У меня нет репутации, чтобы прокомментировать сообщения других народов. Я думал, что будет исключение, если бы это был бесконечный цикл, ошибочно думал, что это рекурсивный цикл. Показ большего количества кода может помочь. – Flugsio

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 не должен печатать ошибки или отображать содержимое списка; он должен найти пункт и ничего больше. Это результат смешивания вашей бизнес-логики с логикой приложения.

Правильная реализация такого рода вещей должна быть полностью отделена от подсказок и т. Д. Фактически, в реальном мире не будет реализовываться связанный список вообще - можно использовать java.util.LinkedList. Я подозреваю, что это не вариант, поскольку это школьное задание. Однако вы можете сделать следующее самое лучшее, и используйте java.util.AbstractSequentialList. Если это не разрешено, то внесите java.util.List самостоятельно или, по крайней мере, создайте реализацию связанного списка на этом интерфейсе. Помимо этого, SMOP должен был реализовать необходимую структуру меню.

+0

Я предполагаю, что 'else' по-прежнему не прав, это приведет к выходу' Error.' для каждого элемента, не соответствующего 'ID'. То, что OP, вероятно, означало, это print 'Error.', если элемент не найден, что должно быть сделано после цикла while, если' current' равно null. Также, если найден правильный элемент, в то время как цикл, вероятно, должен быть завершен. Не сказать, что вы ошибаетесь, но op должен прояснить свои идеи. –

+0

@maremp, но это действительно просто симптом более серьезной проблемы, смешение бизнес-логики и логики приложений. Я добавил раздел к моему ответу, предлагающий, как преодолеть эту проблему. – AJMansfield

+0

Я понял, что когда я взглянул на код, мне потребовалось почти 5 минут, чтобы просто получить представление о том, что он должен делать, и о том, как это происходит. Что касается последнего редактирования, я предполагаю, что использование внешних классов или интерфейсов, вероятно, не является вариантом. По крайней мере, так было на моем курсе алгоритмов uni в этом году, для нашего промежуточного назначения нам пришлось реализовать двусвязный список с нуля, никаких других классов/интерфейсов не было разрешено. –

Смежные вопросы