我已经创建了自己的异常,但是当我尝试使用它时,我会收到一条消息,指出它无法转换为我的异常
我有一个像这样的界面
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
上捕获除零异常。
答案 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已被删除,因为它在隐藏真正的堆栈跟踪时通过在不需要时创建新实例。它已在方法签名中声明,并且没有实际处理。