2015-01-01 148 views
-3

我在做一個學校項目。我希望用戶訂購產品,顯示訂單審覈,然後選擇是否要確認或拒絕訂單。但是,該程序停留在無限循環中。我知道這與變量valid有關,但我不知道爲什麼因爲我爲了停止循環而宣佈它爲true。如果我刪除了確認部分,那麼一切正常。我的邏輯正確嗎?

public void selectOrder(Vector <Stock> temp){ 
    sc.useDelimiter("\n"); 
    String conf = "[YyNn]"; 
    String exit = "[e][x][i][t]"; 
    valid = false; 
    out = false; 
    confirm = false; 
    do{ 
     System.out.println("Enter Product ID to Order: (Type exit to Quit)"); 
     pid = sc.next(); 
     if(pid.matches(chkpid)){ 
      out = false; 
      for(int i = 0; i < temp.size(); i ++){ 
       s = temp.elementAt(i); 
       if(pid.equals(s.getPid())){ 
        l = i; 
        found = true; 
        break; 
       }else 
        found = false; 
      } 
      v = true; 
      do{ 
       try{ 
        System.out.println ("Please Enter Quantity to Order: "); 
        q = sc.nextInt(); 
        v = false; 
       }catch(InputMismatchException ime){ 
        sc.next(); 
        System.out.println ("Invalid Input. Try Again."); 
       } 
      }while(v); 

      if(found == true){ 
       oldQty = temp.elementAt(l).getQuantity(); 
       originalQty = Integer.parseInt(oldQty); 
       afterQty = originalQty - q; 
       cst = temp.elementAt(l).getCost(); 
       cost = Integer.parseInt(cst); 
       System.out.println(); 
       System.out.println ("-------------Order Review-------------"); 
       System.out.println ("Product Name: " + temp.elementAt(l).getName()); 
       System.out.println ("Quantity: " + q); 
       System.out.println ("Price Preview(excluding tax): €" + (cost * q)); 
       System.out.println ("--------------------------------------"); 
       System.out.println(); 
       do{ 
        System.out.println ("Confirm Order? (Y/N)"); 
        con = sc.next(); 
       }while(!(con.matches(conf))); 

       if(con.equals("y") && con.equals("Y")){ 
        if((originalQty > 0) && (afterQty >= 0)){ 
         String newQty = Integer.toString(afterQty); 
         temp.elementAt(l).setQuantity(newQty); 
         System.out.println ("Order Successfull."); 
         valid = true; 
        }else if(originalQty <= 0){ 
         System.out.println ("Product is Currently out of Stock!"); 
         valid = false; 
        }else if(afterQty < 0){ 
         System.out.println ("Quantity exceeds Stock Available!"); 
         valid = false; 
        } 
       } 
      }else{ 
       System.out.println ("Product ID Not Found!"); 
       valid = false; 
      } 
     }else if (!(pid.matches(chkpid)) && !(pid.matches(exit))){ 
      System.out.println ("Invalid Product ID Format."); 
      valid = false; 
     } 
     if(pid.matches(exit)) 
      out = true; 
    }while((valid != true) && !(pid.matches(exit))); 
    System.out.println(); 
} 
+0

您正在調試嗎?代碼在哪裏? – boctulus

+0

@Boctulus不,我仍然是一個初學者在java中,不太清楚如何調試。 –

+0

你可以粘貼你的輸出打印語句嗎? – SMA

回答

3

(con.equals("y") && con.equals("Y"))應該(con.equals("y") || con.equals("Y"))

你曾說過的反應必須是 「Y」 和 「y」。你想||意思還是。

1

你可以做的事情。

  1. 放入更多System.outs(sysouts)並檢查哪些語句是無限打印的,以解決問題。
  2. 將代碼移動到更多模塊化格式,而不是一個單片模塊。例如一旦找到該項目,將整個if塊移動到一個新的方法,如processFoundItem(item),該方法需要一個參數,即剛剛找到的項目。
  3. 不只是抓住例外情況,還要用e.printStackTrace()取代完整的堆棧跟蹤。

請按照下列步驟操作,並且您應該能夠解決您的查詢。

如果你可以添加一些更多的信息,我可以幫助更多。

+0

這不是一個答案,它是一個評論。 – Jasen

+1

100%肯定,這個腳本需要模塊化 – boctulus

0

我認爲@pbabcdefp有正確的答案,但男孩,你的代碼是真的搞砸了!

  • 不要編寫如此長的嵌套方法。在邏輯部分中打破它們(有一個目標或目的)並使它們成爲子方法。
  • 使用「發言」標識符。這是什麼qv,l ...?
  • 使用正確的類型。例如。在Stock班,爲什麼數量和成本String
  • 使用布爾邏輯的規律。 valid != true應該是! valid
  • 如果僅在本地需要它們,則使用局部變量。例如。爲什麼found是一個實例變量?即使您在幾種方法中需要found,每種方法都可以有其自己的方法。實例變量用於表示實例的狀態,而不是該方法的「全局嘔吐桶」。
  • 計算單獨輸入/輸出。今天,您可以從控制檯掃描字符串,明天您可以從Web界面或數據庫獲取您的值。保持與此分開的計算,或者你必須每次觸碰它與完全無關的變化。
+0

感謝您的評論。我是一般的編程新手,我仍然在學習。我會確保實施你的建議。再次感謝。 –

0

我覺得你的問題是在(valid != true) && !(pid.matches(exit)) clausule。我重拍你的代碼並添加了一些評論,這個評論有一個##標記它。

public void selectOrder(Vector <Stock> temp){ 
    sc.useDelimiter("\n"); 
    String conf = "[YyNn]"; 
    String exit = "[e][x][i][t]"; 
    valid = false; 
    out = false; 
    confirm = false; 
    do{ 
     System.out.println("Enter Product ID to Order: (Type exit to Quit)"); 
     pid = sc.next(); 
     if(pid.matches(chkpid)){ 
      out = false; 
      // ## Added && found to make it shorter 
      found = false 
      for(int i = 0; i < temp.size() && !found; i ++){ 
       s = temp.elementAt(i); 
       if(pid.equals(s.getPid())){ 
        l = i; 
        found = true; 
       } 
      } 
      v = true; 
      do{ 
       try{ 
        System.out.println ("Please Enter Quantity to Order: "); 
        q = sc.nextInt(); 
        v = false; 
       }catch(InputMismatchException ime){ 
        sc.next(); 
        System.out.println ("Invalid Input. Try Again."); 
       } 
      }while(v); 

      // ## Found is a boolean variable, has true or false value inside 
      if(found /*== true*/){ 
       oldQty = temp.elementAt(l).getQuantity(); 
       originalQty = Integer.parseInt(oldQty); 
       afterQty = originalQty - q; 
       cst = temp.elementAt(l).getCost(); 
       cost = Integer.parseInt(cst); 
       System.out.println(); 
       System.out.println ("-------------Order Review-------------"); 
       System.out.println ("Product Name: " + temp.elementAt(l).getName()); 
       System.out.println ("Quantity: " + q); 
       System.out.println ("Price Preview(excluding tax): €" + (cost * q)); 
       System.out.println ("--------------------------------------"); 
       System.out.println(); 
       do{ 
        System.out.println ("Confirm Order? (Y/N)"); 
        con = sc.next(); 
       }while(!(con.matches(conf))); 

       // ## It could be a fail, change && to || or do what I do 
       // ## if(con.equals("y") && con.equals("Y")){ 
       if(con.equalsIgnoreCase("y")){  
        if((originalQty > 0) && (afterQty >= 0)){ 
         String newQty = Integer.toString(afterQty); 
         temp.elementAt(l).setQuantity(newQty); 
         System.out.println ("Order Successfull."); 
         valid = true; 
        }else if(originalQty <= 0){ 
         System.out.println ("Product is Currently out of Stock!"); 
         valid = false; 
        }else if(afterQty < 0){ 
         System.out.println ("Quantity exceeds Stock Available!"); 
         valid = false; 
        } 
       } 
      }else{ 
       System.out.println ("Product ID Not Found!"); 
       valid = false; 
      } 
     }else if (!(pid.matches(chkpid)) && !(pid.matches(exit))){ 
      System.out.println ("Invalid Product ID Format."); 
      valid = false; 
     } 
     if(pid.matches(exit)) 
      out = true; 
     // ## Why you want bool "out" variable if you don't use it. Here is your problem 
     // ## (valid!=true) == while "valid" is false == !valid 
    }while(!valid && !out /*(valid != true) && !(pid.matches(exit))*/); 
    System.out.println(); 
}