2015-01-09 96 views
2

我工作的一個JavaEE應用,我有以下方法:條件語句:死代碼

public String alterar_data_ato_med (int cod_ato, GregorianCalendar nova_data) { 
    AtoMedico a=em.find(AtoMedico.class,cod_ato); 
    Medico m=a.getmedico(); 
    Utente u=a.getutente(); 
    GregorianCalendar today=new GregorianCalendar(); 
    if(a==null){ 
     return "Ato Médico inexistente!"; 
    }else{ 
     if(m.getAgenda_atos().contains(nova_data)||m.getAgenda_consultas().contains(nova_data)){ 
      return "Médico indisponível"; 
     }else{ 
      if(u.getAgenda().contains(nova_data)||nova_data.before(today)){ 
       return "Data indisponível!"; 
      }else{ 
       GregorianCalendar antiga_data=a.getData_ato_med(); 
       a.setData_ato_med(nova_data); 
       m.getAgenda_atos().remove(antiga_data); 
       u.getAgenda().remove(antiga_data); 
       return "Data do ato médico alterada!"; 
      } 
     } 
    } 
} 

第一if-else語句似乎是「死碼」。可以請某人幫我理解爲什麼?

+1

究竟哪一部分是死碼? –

+0

第一個:'if(a == null){return「Atomédicoinexistente!」;} else {...' – Ghost

+0

也FYI,所有'其他'都是無用的,因爲你在所有if案例 – Hacketo

回答

11

a在第一個if語句中不能爲空。如果是這樣,你的代碼會在Medico m=a.getmedico()行發出NullPointerException

+0

唉。美麗:) –

8

那麼,a在達到if-陳述時不能爲空。因此null檢查不需要和if語句中的代碼永遠不會執行 - 因此它是已死

AtoMedico a=em.find(AtoMedico.class,cod_ato); // At this point a may be null... 

Medico m=a.getmedico(); // If a is null here, there will be a NullPointerException 

// And you will not reach this code down here... 

所以,你應該做的卻是這樣的:

AtoMedico a=em.find(AtoMedico.class,cod_ato); 

if (a == null) { 
    return "Ato Médico inexistente!"; 
} 

// Now, it is safe to continue referencing a 
Medico m=a.getmedico(); 
// and so on... 

或者,如果您使用Java 8則可以使用Optional類代替。這個例子展示瞭如何拋出異常而不是返回。

AtoMedico a = Optional.ofNullable(em.find(AtoMedico.class,cod_ato)) 
         .orElseThrow(() -> new IllegalStateException("Ato Médico inexistente!")); 
// Now a is safe to use 

而且,如果你不想那麼你可以使用ifPresent。處理null的好方法!

Optional<AtoMedico> a = Optional.ofNullable(em.find(AtoMedico.class,cod_ato)); 
a.ifPresent(ato -> { 
    // Do your stuff here... 
    Medico m=ato.getmedico(); 
}); 

有關Optional退房此Oracle tutorial更多信息。