Hỏi về null trong Java
Có 3 câu hỏi về null trong Java mình thắc mắc như sau:
Câu 1:
Nên check null ở đâu:
Input -> A -> B -> C-> D -> Output
Ví dụ
Input: Tên học sinh, lớp , trường... -> new Student(...) -> Classroom.addStudent(student) -> School.addClassroom(...) -> print(Classrooe)
Với ví dụ trên, với mỗi bước thì bất cứ bước nào arg là null thì đều không thể thực hiện được. Vậy mình nên kiểu tra null ở đâu:
- Kiểm tra null ở mọi hàm, hàm nào có args là null thì throw
IllegalStateException
- Kiểm tra null ở đầu vào, đầu vào không hợp lệ thì throw IllegalStateException, còn các bước trung gian, output thì ngầm định nó chỉ được gọi khi không null.
- Kiểm tra null ở đầu ra, các bước trước nếu không hợp lệ thì return null
(new Student (invalid args) sẽ trả về null, Classroom.addStudent(null) -> trả về null,
School.addClassroom(null) trả về null).
Câu 2: Liên quan câu 1, đó là khi args không hợp lệ thì mình nên throws IllegalStateException hay mình nên return null.
Câu 3:
Java 7 có 1 hàm là Objects.requireNonNull
, hàm này được implement như vầy:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
Mình thắc mắc là nếu truy xuất 1 method mà pointer
là null thì nó vẫn throw NullPointerException thôi.
Ví dụ studentA.getName(), nếu studentA là null thì nó sẽ throw NullPointerException , vậy mục đích của việc throw new NullPointerException();
một cách trực tiếp để làm gì
Bạn copy nguyên cái exception và message của nó ra và search google là ok nhé
Bạn hiểu sai câu hỏi của mình rồi, mình đâu hỏi cái exception đó để làm gì, mình đang muốn hỏi là trong lập trình, trường hợp args không hợp lệ thì nên kiểm tra args ở bước nào.
Mình đang suy nghĩ nếu có 100 method, nếu lúc nào cũng kiểm tra null theo kiểu:
if(args == null) throws new IllegalStateException()
thì rất là phiển sao
Hi No Name.
Khi bạn bật tivi bạn không thấy nó lên. Vậy bạn mang tivi sửa hay kiểm tra có điện hay không ?
Cái gì kiểm tra dược thì kiểm tra luôn. Cái gì không được thì để đó đợi ngoại lệ.
trường hợp này mình thường chia ra 02 flow, một cái chỉ đơn thuần kiểm tra param, mình dùng annotation kiểu như hibernate
Trường hợp phía sau là kiểm tra business rules mình để trong class Validator riêng cho từng rule , trường hợp này mình return về Exception class do mình định nghĩa riêng cho từng violate
Bổ sung thêm là có thể dùng AOP để validate trong trường hợp business rules cũng khiến code xử lý của bạn “sạch sẽ” hơn hẳn. Tuy nhiên cái lợi cũng có cái hại nên cân nhắc