Một câu hỏi khá ngu ngốc. Đưa ra mã:
public static int sum(String a, String b) /* throws? WHAT? */ {
int x = Integer.parseInt(a); // throws NumberFormatException
int y = Integer.parseInt(b); // throws NumberFormatException
return x + y;
}
Bạn có thể biết đó là Java tốt hay không? Những gì tôi đang nói đến là, NumberFormatException
là một ngoại lệ chưa được kiểm tra. Bạn không cần phải chỉ định nó như một phần của sum()
chữ ký. Hơn nữa, theo như tôi hiểu, ý tưởng của các ngoại lệ không được kiểm tra chỉ là để báo hiệu rằng việc triển khai chương trình là không chính xác, và thậm chí nhiều hơn nữa, bắt các ngoại lệ không được kiểm tra là một ý tưởng tồi, vì nó giống như sửa chương trình xấu trong thời gian chạy .
Ai đó vui lòng làm rõ liệu:
- Tôi nên chỉ định
NumberFormatException
như một phần của chữ ký của phương thức. - Tôi nên xác định ngoại lệ đã kiểm tra của riêng mình (
BadDataException
), xử lýNumberFormatException
bên trong phương thức và ném lại nó dưới dạngBadDataException
. - Tôi nên xác định ngoại lệ đã kiểm tra của riêng mình (
BadDataException
), xác thực cả hai chuỗi theo cách nào đó như biểu thức chính quy và ném của tôiBadDataException
nếu nó không khớp. - Ý tưởng của bạn?
Cập nhật :
Hãy tưởng tượng, nó không phải là một framework mã nguồn mở mà bạn nên sử dụng vì một số lý do. Bạn nhìn vào chữ ký của phương thức và nghĩ - "OK, nó không bao giờ ném". Sau đó, một ngày nào đó, bạn có một ngoại lệ. Nó có bình thường không?
Cập nhật 2 :
Có một số ý kiến nói rằng của tôi sum(String, String)
là một thiết kế tồi. Tôi hoàn toàn đồng ý, nhưng đối với những người tin rằng vấn đề ban đầu sẽ không bao giờ xuất hiện nếu chúng tôi có thiết kế tốt, đây là một câu hỏi bổ sung:
Định nghĩa vấn đề là như thế này: bạn có một nguồn dữ liệu nơi các số được lưu trữ dưới dạng String
s. Nguồn này có thể là tệp XML, trang web, cửa sổ màn hình nền với 2 hộp chỉnh sửa, bất cứ thứ gì.
Mục tiêu của bạn là thực hiện logic lấy 2 String
s này, chuyển chúng thành int
s và hiển thị hộp thông báo cho biết "tổng là xxx".
Bất kể phương pháp tiếp cận bạn sử dụng để thiết kế / triển khai điều này là gì, bạn sẽ có 2 điểm chức năng bên trong :
- Nơi bạn chuyển đổi
String
thànhint
- Nơi bạn thêm 2
int
giây
Câu hỏi chính của bài đăng gốc của tôi là:
Integer.parseInt()
mong đợi chuỗi chính xác được chuyển. Bất cứ khi nào bạn vượt qua một chuỗi xấu , điều đó có nghĩa là chương trình của bạn không chính xác (không phải " người dùng của bạn là một tên ngốc"). Bạn cần triển khai đoạn mã mà một mặt bạn có Integer.parseInt () với ngữ nghĩa PHẢI và mặt khác, bạn cần chấp nhận các trường hợp đầu vào không chính xác - NÊN ngữ nghĩa .
Vì vậy, ngắn gọn: làm cách nào để triển khai ngữ nghĩa NÊN nếu tôi chỉ có thư viện PHẢI .