2016-12-01 71 views
0

的情況是這樣follwing如何打破調用不同對象的嵌套方法?

student.studentsPhone.studentsAccount.topUp(xxx) 

學生是具有返回類型的手機和電話對象的一個​​變量,它返回的是終於有型賬戶的一個變量的方法studentsAccount方法studentsPhone對象所需的方法。

所以我的問題是,如果我有一個學生對象,沒有電話,我會得到一個空指針異常。有沒有辦法切斷我們想要的路線?我不想在主類中實例化所有的東西。我將只實例化Student類。

我雖然幾種方法

  1. 移動的方法了層次結構,但其他對象不會有任何用處的在studentsPhone方法真的

  2. 我說,如果(Phone == null) return;但其不作廢,還有其它方法後studentPhone

+2

http://stackoverflow.com/documentation/java/152/optional/5740/null-進行安全鏈接#t = 20161201201857268931 – shmosel

+1

另一種解決此問題的方法是使用'null-instance'。一旦一個值被認爲是「null」,實例應該被返回,這意味着進一步的操作/方法仍然可以在沒有空指針異常的情況下被調用。 – n247s

+0

請認識到這種鏈接被認爲是[code smell](https://sourcemaking.com/refactoring/smells/message-chains),因爲你的客戶端代碼現在依賴於確切的類結構。 –

回答

0

您可以使用此三元運算符,是這樣的:

String result = student != null ? (student.studentPhone != null ? (student.studentPhone.studentsAccount != null ? student.studentPhone.studentsAccount.topUp(xxx) :"return"): "return") : "return" 

或類似:

boolean isNotNull = student != null ? (student.studentPhone != null ? (student.studentPhone.studentsAccount != null ? true : false): false) : false; 

if(isNotNull){ 
    student.studentPhone.studentsAccount.topUp(xxx); 
} 
0

你可以拋出自己的類型的運行時異常,如果沒有手機。包裹在一個try/catch塊的代碼,捕捉自己的異常,然後用你的函數的其餘部分

void doSomeThing() { 
    Phone getStudentPhone() { 
     if(phone == null) { 
      throw new noPhoneException(); 
     } 
     return phone; 
    } 
} 

try { 
    student.getStudentPhone().studentsAccount.topUp(xxx); 
} catch(noPhoneException e) { 
    // say something about no phone existing 
}