Given the code fragments:



class Employee {

    Optional<Address> address;

    Employee(Optional<Address> address) {
        this.address = address;
    }

    public Optional<Address> getAddress() {
        return address;
    }
}

class Address {

    String city = "New York";

    public String getCity() {
        return city;
    }

    public String toString() {
        return city;
    }
}

and

Address address = null;
Optional<Address> addrs1 = Optional.ofNullable(address);
Employee e1 = new Employee(addrs1);
String eAddress = (addrs1.isPresent()) ? addrs1.get().getCity() : "City Not available";
System.out.println(eAddress);

What is the result?

A.

New York

B.

City Not available

C.

null

D. A NoSuchElementException is thrown at run time.

題解

Optional類別的ofNullable方法允許傳入參考為null的物件參數,來產生Optional物件。由於第41行的address變數為null,因此會產生出空的Optional物件。

程式第42行,利用空的Optional物件來實體化新的Employee物件,這個沒有問題。

程式第43行,先判斷Optional物件的內容是否存在,由於這裡使用的Optional物件是空的,因此會將「City Not available」字串參考指派給eAddress變數儲存。

最後輸出「City Not available」。

若在程式有執行到「addrs1.get()」,將會因為addrs1所參考到的Optional物件的內容是空的,而拋出NoSuchElementException例外。但在這個題目中,使用了三元條件運算子來控制程式的流程,所以不會執行到「addrs1.get()」。