2014-12-14 3 views
1

그래서 지금은 배열 프로그램을 최종 할당을위한 링크 된 목록으로 변환하고 있습니다. 그러나, 내 방법 중 하나를 호출하려고 할 때 문제가 발생했습니다. 사용자가 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"); 
    } 
} 
+1

디버그하십시오. 무슨 일이야? – Kon

+0

우리는 수업 전반에 걸친 디버깅 작업을 수행하지 않았습니다. 어디서부터 시작해야할지 모르겠다. – SeanDiablo

+0

링크 된 목록에 대해 내가 이해 한 바로는 현재 머리에서 시작하여 정확한 항목을 검색하는 많은 항목을 살펴볼 것입니다. 나는 완전히 틀릴 수있어, 나는 이것에 상어에 던져진 것처럼 느낀다. – SeanDiablo

답변

-1

FindItem() 내부의 while 루프는 현재를 재 할당하지 않으며 영원히 반복하지 않는 것처럼 보입니다. 어쩌면 이것을 try-catch 블록 내에서 실행하고 있습니까?

+0

try-catch 내부에서 실행중인 경우 왜 중요합니까? 그리고 이것은 대답이 아니라 주석이어야합니다. –

+0

이것은 어떤 종류의 try-catch에서도 실행되지 않습니다. 현재의 재 할당은 어떻게하면됩니까? – SeanDiablo

+0

다른 사람들의 게시물에 대한 평판은 없습니다. 나는 그것이 무한 루프라면 예외가있을 것이라고 생각하고 있었다. 잘못 재귀 루프라고 생각했다. 더 많은 코드를 보여 주면 도움이 될 수 있습니다. – Flugsio

2

코드의 첫 번째 문제는 스타일입니다. 여기가 자바의 코딩 규칙을 사용하여 어떻게 보일지입니다 : 문체의 문제와

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 일 것입니다.

+0

'else'가 여전히 틀렸다고 생각합니다. 이것은'ID'와 일치하지 않는 각 요소에 대해'Error.'를 출력합니다. OP가 의미 한 것은 아마도 요소가 발견되지 않으면'Error.'를 출력하는 것이고, while 루프 뒤에'current'가 null이면 끝나야합니다. 또한 올바른 요소가 발견되면 loop는 종료되어야합니다. 당신이 틀렸다고 말하는 것은 아니지만 op는 아이디어를 분명히해야합니다. –

+0

@maremp하지만 그것은 정말로 더 큰 문제 인 혼합 된 비즈니스와 애플리케이션 로직의 증상 일뿐입니다. 나는 그 문제를 극복하는 방법을 제안하는 나의 대답에 섹션을 추가했다. – AJMansfield

+0

코드를 살펴 보았을 때, 실제로 무엇을해야하는지, 어떻게 실패했는지를 알기까지는 거의 5 분이 걸렸습니다. 마지막 편집에 관해서는 외부 클래스 나 인터페이스를 사용하는 것이 아마도 옵션이 아니라고 추측합니다. 적어도 올해는 유니 알고리즘 (uni algorithms) 과정의 사례였습니다. 중간 중간 과제를 위해 이중 링크 된 목록을 처음부터 구현해야 했으므로 다른 클래스/인터페이스는 허용되지 않았습니다. –