如何在try-catch块中递归调用一个方法

时间:2014-02-14 16:02:16

标签: java exception recursion exception-handling

嗨,我有这个问题,我有一个方法,让用户插入一个代表产品“数量”的值,现在如果用户想要的数量高于库存量,它必须抛出异常并让用户再次输入数字我尝试插入相同方法的递归调用,但即使成功它也会进入无限循环,就像异常仍然是“活着”

...
try {
    if (!lol2)
        throw new NegativeNumberException(); 
} catch (NegativeNumberException pto) {
    JOptionPane.showMessageDialog(frame, "Quantità non disponibile");
    this.addToCart(cart,quant);         
}
编辑我现在包括了所有的代码但是对于代码的“复杂性”来说有点难以理解

完整代码

public void addToCart(ArrayList<Utilizzabile> cart,ArrayList<Integer> quant) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
boolean lol=false;
Utilizzabile us=null;
String id = JOptionPane.showInputDialog(frame, "Inserisci un ID prodotto:");
if (id ==null) { return;}
while (!id.matches("[0-9]+")) { //user inserts a value and the while checks for an int value inserted
    JOptionPane.showMessageDialog(frame, "Valore inserito errato");
    id = JOptionPane.showInputDialog(frame, "Inserisci un ID prodotto:");
    if (id == null) { return;} }
int iden = Integer.parseInt(id);
for (Utilizzabile u: arr) { // this for loop checks if the ID inserted represents a product in the catalog
    if ((u.getId() == iden) && (u.eAcquistabile())) {
        lol =true;
        us = u; } } 
if (lol == true) { //now if the ID corresponds to an existent product it ask the user to input the quantity requested
    boolean lol2=false;
    String qua = JOptionPane.showInputDialog(frame, "Inserisci un quantità da aggiungere al carrello:");
    if (qua ==null) { return;}
    while (lol2==false) {
    while (!qua.matches("[0-9]+")) {
        JOptionPane.showMessageDialog(frame, "Valore inserito errato");
        qua = JOptionPane.showInputDialog(frame, "Inserisci un quantità da aggiungere al carrello:");
        if (qua == null) { return;} }
    if (qua.length()>0 && qua.length()<=8) {
    int quantit = Integer.parseInt(qua);
    for (int l=0;l<cart.size();l++) { //this for checks if in the cart were already that product and then changes the quantities only
        if ((cart.get(l).getId() == us.getId()) && (us.getRem()-quantit >0) ) {
            int num = quant.get(l)+quantit;
            quant.set(l,num);
            JOptionPane.showMessageDialog(frame, "Quantità del prodotto richiesto aggiornata");
            return;}                
    }
    if ( (us.getRem()-quantit) >0) { //checks if all went good and the quantity is avaiable
            JOptionPane.showMessageDialog(frame, "Prodotto della quantità richiesta aggiunto al carrello");
            lol2=true;
            cart.add(us);
            quant.add(quantit);} }
    try {
        if (lol2==false)
            throw new NegativeNumberException(); }
    catch (NegativeNumberException pto){
        JOptionPane.showMessageDialog(frame, "Quantità non disponibile");
        this.addToCart(cart,quant); }       
    } }
else {
    JOptionPane.showMessageDialog(frame, "Prodotto non trovato");
    this.addToCart(cart,quant); }       

}

此代码本质上是一个图形部分,让用户将产品添加到购物车并检查一切是否正常,但我需要设置一个例外来检查库存中的数量是否小于用户所需的数量(我毫无例外地完成了它没有任何问题,但这是一个考试,我只是注意到教授希望我必须通过使用异常来解决这个问题

3 个答案:

答案 0 :(得分:2)

为此使用递归并不好,因为在“n”调用之后,您可以接收StackOverFlowError。我同意@laune。 因此我建议使用循环。例如:

while (true){
    // lol2 here is TRUE if was entered correct value and false if not.
    if (lol2)
        break;
    else {
        JOptionPane.showMessageDialog(frame, "Quantità non disponibile");
        this.addToCart(cart,quant);
    }
}

答案 1 :(得分:1)

切勿使用异常来控制常规或几乎常规的控制流。这是糟糕的编程风格。

使用一些do语句重复对话,直到获得满意的输入。

由于缺乏上下文,因此未提供任何代码。 (递归调用在哪里?)

<强>后来 但是,有异常处理的余地。您可以丢弃模式匹配和长度检查并捕获NumberFormatException。

Integer quantity = null;
do {
    String id ... dialogue
    try {
        quantity = Integer.parseInt( id );
        if( quantity <= 0 ) throw new NumberFormatException( "only positive integers" );
    } catch(  NumberFormatException nfe ){
        ... error dialogue;
        quantity = null;
    }
} until( quantity != null );

答案 2 :(得分:1)

将try catch插入do while循环中。

当用户插入正确的值停止循环时 E.g

  int a=10;
  do{
        try{
             if(a<20)   
                 throw new NegativeNumberException(); 
             else
                  break;
           }catch (NegativeNumberException pto){

              JOptionPane.showMessageDialog(frame, "Quantità non disponibile");
              //enter quantity again
              // a=20;
           }
    }while(true);