Nó rất tinh tế. Float.parseFloat
trả lại float
, không phải Float
. Hai toán hạng thứ hai của toán tử có điều kiện phải cùng loại, nhưng bạn đang cho nó float
(kết quả của Float.parseFloat
) và Float
(def
). Trình biên dịch chọn float
vì Float
có thể bị ép buộc thành float
thông qua tự động mở hộp.
Vì vậy, những gì các kết quả đầu ra trình biên dịch cũng giống như bạn đã viết bài này:
private static Float toFloat(Float def, String str) {
try {
return str != null ? Float.parseFloat(str) : def.floatValue();
// Note ----------------------------------------^^^^^^^^^^^^^
} catch (NumberFormatException e) {
return def;
}
}
... và dĩ nhiên, gọi floatValue
trên null
ném một NPE.
Bạn có thể sửa lỗi bằng cách đảm bảo loại toán hạng thứ hai là Float
, không phải float
. Rất nhiều cách để làm điều đó, nhưng như Zefick points out, đơn giản nhất là Float.valueOf(String)
:
private static Float toFloat(Float def, String str) {
try {
return str != null ? Float.valueOf(str) : def;
} catch (NumberFormatException e) {
return def;
}
}
Nguồn
2017-01-17 11:25:05
Float.valueOf (str) – Zefick
@Zefick: Doh! Có thực sự ... –
Đề xuất của tôi, vì lợi ích của sự rõ ràng, sẽ là để thoát khỏi toán tử '?' Và sử dụng một 'if' đơn giản. Có, bạn sẽ có thêm một vài dòng mã. Nhưng nó cũng dễ hiểu hơn những gì đang xảy ra, trong khi phân tích cú pháp và ngay lập tức quay trở lại phao vốn sẽ khiến tôi nghĩ "Tôi đang làm cái quái gì vậy ..." vài tháng sau ... :) - Vâng 'valueOf' là cách dễ nhất tất nhiên ... Duh! – Quota