在catch或初始化中将null值处理为default

时间:2017-12-02 10:51:13

标签: java

我有一个可以返回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块。

4 个答案:

答案 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的截图: enter image description here

答案 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);

现在这比显式空检查效率低,但我发现它非常易读。