Trong bài viết trước về NullPointerException trong Java, mình đã trình bày với các bạn một số trường hợp có thể xảy ra lỗi NPE và cách giải quyết để tránh chúng như thế nào. Từ Java 8 trở đi, chúng ta có một cách khác để tránh NullPointerException nữa, đó chính là sử dụng đối tượng Optional. Cụ thể nó như thế nào, chúng ta sẽ cùng nhau tìm hiểu trong bài viết này các bạn nhé!
OK, bắt đầu nào các bạn…
Đối tượng Optional là một đối tượng generic, nó là một container cho một object reference. Điều này có nghĩa, bạn khai báo một biến tham chiếu tới một đối tượng, biến này có thể đã được khởi tạo hoặc chưa khởi tạo, và đối tượng Optional này sẽ chứa biến tham chiếu này.
Chúng ta có thể xem Optional như là một stream có chứa 0 hoặc 1 phần tử là một object reference, 0 nếu object reference của chúng ta bị null, 1 nếu object reference của chúng ta đã được khởi tạo.
Điều này sẽ đảm bảo là khi các bạn sử dụng biến tham chiếu của chúng ta thông qua đối tượng Optional, giá trị trả về sẽ do đối tượng Optional quản lý và do đó giá trị của biến tham chiếu này sẽ không bao giờ bị null.
Bây giờ, mình sẽ lấy một ví dụ để các bạn hình dung cách sử dụng đối tượng Optional nhé các bạn!
Giả sử mình có một phương thức dùng để lấy ngày sinh của một sinh viên dựa vào id mà mình truyền vào, sau khi xử lý một số trường hợp, trường hợp cuối cùng method này trả về null. Cụ thể phương thức đó như sau:
1
2
3
4
public
Date
getDateOfBirth
(
int
studentId
)
{
// Do something
return
null
;
}
Bây giờ, mình sẽ sử dụng method này và không may là nó trả về null và mình bị NPE.
Trong trường hợp này, mình có thể sử dụng đối tượng Optional để handle trường hợp NullPointerException như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package
com
.
huongdanjava
;
import
java
.
util
.
Date
;
import
java
.
util
.
Optional
;
public
class
Example
{
public
Date
getDateOfBirth
(
int
studentId
)
{
// Do something
return
null
;
}
public
static
void
main
(
String
[
]
args
)
{
Example
e
=
new
Example
(
)
;
Optional
<Date>
date
=
Optional
.
ofNullable
(
e
.
getDateOfBirth
(
1
)
)
;
date
.
ifPresent
(
d
–
>
System
.
out
.
println
(
d
.
getDate
(
)
)
)
;
}
}
Trong ví dụ này, mình đã khởi tạo một đối tượng Optional chứa một biến tham chiếu đến kiểu dữ liệu Date, biến tham chiếu này có thể null hoặc không tùy vào giá trị của phương thức getDateOfBirth().
Và ở đoạn code dưới, mình sử dụng phương thức ifPresent của đối tượng Optional với Lambda Expression để in ra ngày trong trường hợp biến tham chiếu này khác null.
Thử chạy ví dụ này, các bạn sẽ thấy không còn lỗi NPE xuất hiện nữa.
1.6/5 – (15 bình chọn)