处理异常的问题

时间:2011-08-15 14:51:23

标签: java exception

我已经创建了自己的异常,但是当我尝试使用它时,我会收到一条消息,指出它无法转换为我的异常

我有一个像这样的界面

public interface MyInterface
{   
    public OtherClass generate(ClassTwo two, ClassThree three) throws RetryException;
}

其他像这样的

public class MyGenerator{   
  public class generate (ClassTwo two, ClassThree three){
    try{
    }catch(MyException my)
  }
}

最后是另一个类中的方法

public Object evaluate(String expression, Map values) throws FirstException, RetryException
{
   try{
   }catch (Exception x){
     if(x instanceof FirstException){
       throw new FirstException()
     }
     else{
       RetryException retry= (RetryException)x;
       retry.expression = expression;
       retry.position = position;
       retry.operator = tokens[position];
       retry.operand = 1;
       throw retry; 
     }
  }
}

最后一个方法的try try块是进行数学运算,我想在RetryException上捕获除零异常。

2 个答案:

答案 0 :(得分:6)

RetryException retry= (RetryException)x; 

这行代码试图将Exception强制转换为RetryException。这只有在以下情况下才会起作用:RetryException适当地扩展了你捕获的Exception类型(ArithmeticException为除以零,我想?)。和Exception实际上是一个RetryException。如果没有更多的逻辑,我们不知道这是否属实。

尝试检查

if (x instanceof RetryException)

在你做这个演员之前。您的代码可能会抛出不同类型的异常。

最好你有多个捕获块......

try{
//}catch (FirstException e) -- I removed this, as you are only catching it and then directly
                        //     throwing it, which seems uneecessary
}catch (RetryException r){
    //process r
    throw r;
}

如果我误解了你的问题,我会尽力纠正这个问题。

答案 1 :(得分:4)

我将在这里做一些重大假设,因为代码示例非常不完整。

在你的evaluate方法中,由于除以零而得到一个ArithmeticException,你想通过在处理程序中抛出自己的RetryException来处理它。收到的异常无法生成,因为它的类型错误,您应该在evaluate方法中捕获ArithmeticException,然后创建并抛出一个新的RetryException。

public Object evaluate(String expression, Map values) throws FirstException, RetryException
{
   try{
       // Some code that may throw FirstException
       int x = 10/0;
   }catch (ArithmeticException x){  // Handle divide by zero
       RetryException retry= new RetryException();
       retry.setExpression(expression);
       retry.setPosition(position);
       retry.setOperator(tokens[position]);
       retry.setOperand(1);
       throw retry; 
     }
  }
}

这一切都假设存在适当的RetryException,当然还有适当的setter方法。

FirstException catch已被删除,因为它在隐藏真正的堆栈跟踪时通过在不需要时创建新实例。它已在方法签名中声明,并且没有实际处理。