2011-08-15 36 views
5

tôi đã tạo ra ngoại lệ của riêng tôi nhưng khi tôi cố gắng sử dụng nó, tôi nhận được một thông báo nói rằng nó không thể được đúc để ngoại lệ của tôivấn đề xử lý ngoại lệ

Tôi đã có một giao diện như thế này

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

khác như một

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

và cuối cùng là một phương pháp này trong lớp khác

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

Khối thử bắt trên phương pháp cuối cùng là thực hiện phép toán và tôi muốn bắt một bộ phận bằng không ngoại lệ trên RetryException.

+4

nói whaaaaaaaa o_O – mre

+0

Tôi đã sửa các thẻ mã, sau đó một người nào đó đã chỉnh sửa sau lưng tôi và làm hỏng chúng .... –

+1

Cuộc chiến lớn để khắc phục bài đăng này. – James

Trả lời

6
RetryException retry= (RetryException)x; 

Dòng mã này đang cố gắng loại trừ Ngoại lệ làm Ngoại lệ thử lại. Điều này sẽ chỉ hoạt động nếu: RetryException mở rộng một cách thích hợp loại ngoại lệ mà bạn đang bắt (ArithmeticException để chia cho số không, tôi nghĩ?). VÀ ngoại lệ thực sự là một RetryException. Nếu không xem xét nhiều hơn về logic của bạn, chúng tôi không có ý tưởng nếu điều này là đúng sự thật.

Hãy thử kiểm tra

if (x instanceof RetryException) 

Trước khi bạn làm diễn viên này. Mã của bạn có thể đang ném một loại Ngoại lệ khác.

Tốt, bạn sẽ thay có nhiều khối 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; 
} 

Nếu tôi hiểu lầm câu hỏi của bạn, tôi sẽ làm hết sức mình để sửa chữa này.

+0

Sam DeHaan trong mã của tôi ngoại lệ theo cây này 'Ngoại lệ -> MyFirstException -> RetryException' – alculete

+0

vậy, không ai có giải pháp cho tôi? – alculete

+0

Những gì nó đi xuống là này: Bạn đang cố gắng để đúc một ngoại lệ cho một RetryException ('(RetryException) x'). Ngoại lệ không nhất thiết là một RetryException, do đó, điều này không thành công. Chúng tôi đã cung cấp một vài giải pháp cho vấn đề này, nhưng bạn đã không chấp nhận chúng hoặc cung cấp lý do tại sao chúng sẽ không hoạt động. –

4

Tôi sẽ thực hiện một số giả định lớn ở đây về những gì đang xảy ra, vì các ví dụ mã là rất không đầy đủ.

Trong phương pháp đánh giá của bạn, bạn đang nhận được một ArithmeticException do một phân chia bằng không và bạn muốn xử lý nó bằng cách ném RetryException của riêng bạn trong trình xử lý. Ngoại lệ nhận được không thể được đúc vì nó là loại sai, bạn nên bắt ArithmeticException trong phương pháp đánh giá của bạn và sau đó tạo và ném một RetryException mới.

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

Tất cả điều này giả định rằng một RetryException thích hợp tồn tại với các phương thức setter thích hợp của khóa học.

Bắt đầu ngoại lệ bắt được xóa vì nó đang ẩn các ngăn xếp thực bằng cách tạo một cá thể mới khi không có yêu cầu. Nó đã được khai báo trong chữ ký phương thức và không có xử lý thực sự.

+0

Câu trả lời hay, nhưng mã Java không đúng định dạng. 'setProperty() = x' nên là' setProperty (x) ' –

+0

@Sam DeHaan Vâng, tôi chỉ đang tái cấu trúc mã OP và đã hơi vội vã. Cảm ơn bạn đã chỉ ra, nó đã được sửa. – Robin

+0

Có, việc tái cấu trúc là rất tốt, chỉ không muốn +1 cho đến khi nó được sửa chữa. –