2015-01-01 154 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(); 
}