条件声明:死代码

Gho*_*ost 2 java if-statement dead-code

我正在研究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!";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个if-else语句似乎是"死代码".可以请有人帮我理解为什么?

use*_*259 11

a在第一个if语句中不能为null.如果是这样,您的代码会抛出一个NullPointerExceptionMedico m=a.getmedico()行.


was*_*ren 8

好吧,a当它到达if-statement 时永远不会为null .因此,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...
Run Code Online (Sandbox Code Playgroud)

所以,你应该做的事情是这样的:

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...
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用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
Run Code Online (Sandbox Code Playgroud)

并且,如果您不希望您可以使用ifPresent.处理null的好方法!

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

有关详细信息,Optional请查看此Oracle教程.