条件 statement:dead 代码
Conditional 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!";
}
}
}
}
第一个 if-else 语句似乎是 'dead code'。可以请有人帮我理解为什么吗?
a
在第一个 if 语句中不能为 null。如果是,您的代码将在 Medico m=a.getmedico()
行抛出一个 NullPointerException
。
嗯,a
在到达 if
语句时永远不会为 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...
所以,你应该做的是:
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
class。此示例显示如何抛出异常而不是 return.
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。
我正在开发一个 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 语句似乎是 'dead code'。可以请有人帮我理解为什么吗?
a
在第一个 if 语句中不能为 null。如果是,您的代码将在 Medico m=a.getmedico()
行抛出一个 NullPointerException
。
嗯,a
在到达 if
语句时永远不会为 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...
所以,你应该做的是:
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
class。此示例显示如何抛出异常而不是 return.
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。