Giao diện java.lang.Iterator
có 3 phương pháp: hasNext
, next
và remove
. Để triển khai trình lặp vòng chỉ đọc, bạn phải cung cấp triển khai cho 2 trong số đó: hasNext
và next
.Việc cần làm của ngoại lệ khi triển khai java.lang.Iterator
Vấn đề của tôi là các phương pháp này không khai báo bất kỳ ngoại lệ nào. Vì vậy, nếu mã của tôi bên trong quá trình lặp lại tuyên bố ngoại lệ, tôi phải kèm theo mã lặp lại của tôi bên trong khối try/catch.
Chính sách hiện tại của tôi đã được tính lại ngoại lệ kèm theo trong RuntimeException
. Nhưng điều này có vấn đề bởi vì các trường hợp ngoại lệ được kiểm tra bị mất và mã khách hàng không còn có thể bắt các ngoại lệ đó một cách rõ ràng nữa.
Tôi làm cách nào để giải quyết giới hạn này trong lớp Iterator?
Dưới đây là một số mẫu mã cho rõ ràng:
class MyIterator implements Iterator
{
@Override
public boolean hasNext()
{
try
{
return implementation.testForNext();
}
catch (SomethingBadException e)
{
throw new RuntimeException(e);
}
}
@Override
public boolean next()
{
try
{
return implementation.getNext();
}
catch (SomethingBadException e)
{
throw new RuntimeException(e);
}
}
...
}
Một tùy chọn khác, nếu bạn không thể kiểm soát mã máy khách UI: hãy tạo một trình vòng lặp đăng ký ngoại lệ ở đâu đó bằng bộ thu thập hoặc thứ gì đó hoặc gọi giao diện gọi lại hoặc điều gì đó bạn kiểm soát và hiển thị lỗi ở bất kỳ đâu. Nếu điều đó hữu ích cho bạn, bạn có thể tạo ra một "CatcherIterator" mà chỉ đơn giản là kết thúc một trình khởi động-exception-thrower-iterator và nắm bắt tất cả các ngoại lệ posible chuyển hướng chúng đến giao diện property hoặc callback. – helios