2015-01-09 99 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更多信息。