2011-08-15 3 views
5

я создал свое собственное исключение, но когда я пытаюсь использовать его я получаю сообщение о том, что он не может быть приведен к моему исключениюПроблем обработка исключений

У меня есть один интерфейс, как это

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; 
    } 
    } 
} 

Эта попытка catch catch на последнем методе состоит в том, чтобы выполнить математическую операцию, и я хочу поймать деление на нулевое исключение на RetryException.

+4

say whaaaaaaaa o_O – mre

+0

Я исправил теги кода, затем кто-то отредактировал позади меня и испортил их .... –

+1

Большой бой, чтобы исправить это сообщение. – James

ответ

6
RetryException retry= (RetryException)x; 

Эта строка кода пытается исключить исключение как исключение RetryException. Это будет работать, только если: RetryException соответствующим образом расширяет тип исключения, который вы ловите (ArithmeticException для деления на ноль, я думаю?). И исключение фактически является RetryException. Не смотря на больше своей логики, мы понятия не имеем, верно ли это.

Try проверки

if (x instanceof RetryException) 

Перед тем, как сделать этот бросок. Ваш код может вызывать другой вид исключения.

Предпочтительно, вы бы вместо того, чтобы иметь несколько блоков Catch ...

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; 
} 

Если я неправильно понял ваш вопрос, я буду делать все возможное, чтобы исправить это.

+0

Sam DeHaan в моем коде исключение следует за этим деревом 'Exception -> MyFirstException -> RetryException' – alculete

+0

Итак, у меня нет решения для меня? – alculete

+0

В чем дело: вы пытаетесь применить исключение к RetryException ('(RetryException) x'). Исключение не обязательно является RetryException, поэтому это не работает. Мы предложили несколько решений для этого, но вы их не приняли или не дали причин, по которым они не будут работать. –

4

Я собираюсь сделать некоторые большие предположения здесь о том, что происходит, поскольку примеры кода очень неполны.

В вашем методе оценки вы получаете исключение ArithmeticException из-за деления на ноль, и вы хотите обработать его, выбросив в обработчик собственное RetryException. Полученное исключение не может быть выполнено из-за неправильного типа, вы должны поймать 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 существует с соответствующими методами настройки, конечно.

Удар FirstException был удален, так как он скрывал реальную стеклу, создавая новый экземпляр, когда нет необходимости. Он уже объявлен в сигнатуре метода и фактической обработки не было.

+0

Хороший ответ, но довольно искаженный код Java. 'setProperty() = x' должен быть' setProperty (x) ' –

+0

@Sam DeHaan Да, это я просто рефакторинг кода OP и был немного поспешным. Спасибо, что указали это, теперь оно исправлено. – Robin

+0

Да, рефакторинг велик, просто не хотелось +1 до тех пор, пока он не был исправлен. –

Смежные вопросы