2017-01-17 19 views
10

Chương trình này phải tránh null khi gọi tớiFloat bằng null. nhưng tôi vẫn nhận được NPE .. bất kỳ sự giúp đỡNPE khi cố gắng trả về giá trị rỗng

System.out.println(toFloat(null, null));

private static Float toFloat(Float def, String str) { 
    try { 
     return str != null ? Float.parseFloat(str) : def; 
    } catch (NumberFormatException e) { 
     return def; 
    } 
} 

Trả lời

14

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 floatFloat 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; 
    } 
} 
+2

Float.valueOf (str) – Zefick

+0

@Zefick: Doh! Có thực sự ... –

+2

Đề 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

Các vấn đề liên quan