我有一个可以返回NullPointer
的方法,在这种情况下,必须使用默认的 0.0 值。
我想知道
之间是否存在差异double a=0.0;
try{
a=somemethod();
catch(NullPointerException exc){
}
return a;
和
double a;
try{
a=somemethod();
catch(NullPointerException exc){
a=0.0;
}
return a;
如果是,最好的方法是什么?
注:
somemethod()
只是一个示例,实际上它是一个库的方法,我无法编辑或修复以避免源NullPointer
所以我必须使用catch块。
答案 0 :(得分:1)
首先:用例看起来有缺陷:您不需要捕获NPE然后使用默认值。也许该方法应抛出一些其他异常或返回默认值本身。
除此之外我还会使用第二种方法,因为如果您忘记在某个代码分支中设置值并且没有空catch
块,编译器可以发出警告。< / p>
考虑一下:
double a=0.0;
try{
// for some reason we forget to assign a
// the function would return 0 and you don't notice this mistake
mymethod();
} catch(NullPointerException exc){
// also an empty catch block is kind of smelly
}
return a;
VS。这样:
double a;
try{
mymethod();
// now the compiler knows that you did not assign a value to a
} catch(NullPointerException exc){
a=0.0;
}
return a;
在更高版本中,编译器可以显示此消息Variable 'a' might not have been initialized
。例如。 IntelliJ IDEA的截图:
答案 1 :(得分:0)
我有一个可以返回null值的方法,在这种情况下,必须使用默认的0.0值。
捕获NullPointerException是一种代码味道。而且你无论如何都不需要它。
接下来,你说,它会返回一个null
,所以它不会抛出NPE。
你要做的是
a=mymethod();
if(a ==null){
a=0.0;
}
答案 2 :(得分:0)
这取决于您的政策是否要根据public User createUser(String login, String password, String firstName, String lastName, String email, String langKey, Long cpf) {
User user = new User();
Authority authority = authorityRepository.findOne(AuthoritiesConstants.USER);
Set<Authority> authorities = new HashSet<>();
user.setLogin(login);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEmail(email);
//user.setImageUrl(userDTO.getImageUrl());
if (langKey == null) {
user.setLangKey(Constants.DEFAULT_LANGUAGE); // default language
} else {
user.setLangKey(langKey);
}
authorities.add(authority);
user.setAuthorities(authorities);
String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword());
user.setPassword(encryptedPassword);
user.setResetKey(RandomUtil.generateResetKey());
user.setResetDate(Instant.now());
user.setActivated(true);
userRepository.save(user);
userSearchRepository.save(user);
log.debug("Created Information for User: {}", user);
//update Aluno class
Aluno al = new Aluno();
al.setUsuario(user);
al.setCpf(cpf);
alRepository.save(al);
alSearchRepository.save(al);
log.debug("Created Information for UserExtra: {}", al);
return user;
}
的例外情况抛出异常。
如果没有并且mymethod()
可以返回null,您可以在捕获阻止并设置mymethod()
值时知道这一点(如果0.0
使用,则不检查a==null
Double
答案 3 :(得分:-1)
在Java 8中,您可以使用
Optional.ofNullable(mymethod())
.orElse(0.0);
现在这比显式空检查效率低,但我发现它非常易读。