2017-03-17 36 views
1

我有一個對象,我想檢查這個對象或嵌套字段是否爲空。我想打印這個neted字段,但我應該檢查是否在某個級別爲null,否則我會得到空指針異常。如何檢查對象和嵌套字段爲空

我知道我能做到這一點:

if(object != null && object.A != null && object.A.B != null && object.A.B.C != null && object.A.B.C.D != null) { doSomething(object.A.B.C.D);} 

但它這麼久。你知道更好的方法來檢查它嗎?

+0

你可以試着將嵌套字段到一個數組,然後運行一個空檢查每數組中的對象,但我認爲這太複雜了,實際上並沒有考慮這麼做。但這是一種可能性。 – ForInfinity

+0

防止它們爲空。使用NullObject模式/範例。 https://en.wikipedia.org/wiki/Null_Object_pattern#Java或者什麼Axel sais vvv – Fildor

+0

好吧,如果這是一個複雜的嵌套數據,那麼在結束時檢查並捕獲NPE,如果發生異常,這是無效的。使用異常並不是一個好主意,但在某些「例外」中,我猜這是更容易的 – AxelH

回答

1

您可以使用返回所有子對象的方法在所有對象上實現一個接口,並創建一個方法來遞歸調用它以驗證是否設置了所有對象。

0

假設這是一個檢查以防止誤用一個方法,所以這不應該發生太多時間。

只要發現此異常,就會使該值無效。

private boolean isValid(YourObject object){ 
    try{ 
     return object.A.B.C.D != null; 
    } catch (NullPointerException npe){ 
     return false; 
    } 
} 

當然,如果你是做了很多的驗證不使用此解決方案,這些返回false,通常,異常是一個沉重的過程。

編輯:

由於Fildor點出來,還有就是用一個try-catch甚至無一例外成本。但使用這個answer我可以認爲這將是有限的,並沒有太多的優化在這條獨特的線上做。

+0

但是,異常不僅在它發生時很昂貴。 try/catch的存在僅僅會觸發成本。 – Fildor

+0

嗯,這可能會改變很多,然後@Fildor。這是昂貴的嗎?查看編輯和鏈接,如果真的需要這個想法,這應該是可以接受的。 – AxelH

+0

不*那麼多。我只是想指出。因此,如果經常進行驗證,那麼找到不需要它的解決方案可能會更有效。但我同意,如果問題成爲問題,就必須考慮到這一點。 – Fildor

1

可選的是Java 8的好辦法

String value = foo.getBar().getBaz().toString(); 

通過可選的將是:

String value = Optional.ofNullable(foo) 
         .map(Foo::getBar) 
         .map(Bar::getBaz) 
         .map(Baz::toString) 
         .orElse("EmptyString");