Ignorar valores Nulos

15 respostas
lucasgarofolo

Estou atribuindo um valor a uma variável através de uma conta que recebe dois parametros, porém, pode haver de um dos parametros estarem nulos.
por exemplo:

public double equacao(int hora, int minutos){

     return hora + (minutos/60);

}

no exemplo, se a hora ou minuto vier nulo, tem a possibilidade de eu ignorar mas sem a criação de if ou outro tipo de verificação ?

15 Respostas

A

No seu exemplo não tem como hora ou minuto virem nulos.

Eles são do tipo primitivo int, nunca são nulos.

lucasgarofolo

e se ao invés de serem int, forem EditText, que dentro desse método eu pego o conteúdo deles e já faço a conta ?
ai tem a possibilidade de virem nulos.

Existe algo qe eu possa fazer sem o uso de ifs elses ?

B

Em Java só usamos o termo nulo para objetos, no teu caso você mostrou dois parâmetros int, que são tipos primitivos, e não objetos.

De qualquer forma, não, não dá para ignorar. Ou você trata objetos nulos com ifs, ou você especifica que, caso você receba como parâmetro um objeto nulo, você irá lançar uma exceção.

Rodrigo_Sasaki

Tem que verificar com condicionais, pode até setar um valor padrão usando um ternário, caso isso faça sentido… mas tem que verificar.

A não ser que queira fazer um catch por NullPointerException, rs… O que não é algo muito legal.

linngallo

Se eu não me engano, existe um método, em JavaUtil, que se chama NullAs()… Vc passa o objeto, e o valor que ele assumiria, caso viesse nulo. Mas suponho que seja aplicado apenas para Wrappers, ou seja, objetos Integer, Long, Double… etc…

lucasgarofolo

Procurei NullAs() na documentation, não achei, não.

É uma wrapper o que estou usando e um método desse seria de grande utilidade, o exemplo foi só exemplo mesmo.

gabrielfrios

Esse JavaUtil é uma classe da linngallo. Não existe tal classe no Java.

daveiga

Nativo não conheço nada, mas pensando em como poderia resolver me ocorreu algo assim, nunca usei mas seria uma ideia:

public class ArgsUtil{
  // ...  
   public void checkNotNull(Object... args){
        for(Object arg : args)
              if(arg == null){
                      // Dispara uma excessão? Printa o número do argumento nulo??? Sei ... pense numa RuntimeException apropriada.
              }

   }
}


// na sua classe:
import static meu.pacote.util.ArgsUtil.*;

public double equacao(Integer hora, Integer minutos){  
     checkNotNull(hora, minmutos);
     return hora + (minutos/60);  
}
lucasgarofolo

bom, vou implementar um método desse mesmo, mas queria algo mais prático, achei que o java já tinha.

Obrigado a todos.
Abraços

B

Se quiser algo para facilitar a validação, recomendo usar a especificação de Bean Validations, e uma implementação como o Hibernate-Validator:

http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html_single/#d0e3404

public class RentalStation {

    @NotNull 
    public Car rentCar(@NotNull Customer customer, @NotNull @Future Date startDate, @Min(1) int durationInDays) { 
        //...
    }
}
linngallo

Ops, desculpa, de fato, é uma classe minha.

Os métodos são mais ou menos assim:

public static Number nullAsZero(Number number) {
		return number == null ? 0 : number;
	}

public static String nullAsEmpty(String str) {
		return str = isFull(str) ? str : "";
	}
R

Eu não sei se entendi direito, mas pelo que percebi vc está querendo ter a opção de passar, apenas a hora mas também quer ter a opção de passar mais parâmetros como os minutos sem fazer um tratamento mais complexo, se for o caso é possível fazer usando varargs da seguinte forma.

public static double equacao (double...hora){
		
		if(hora.length == 2)
		return hora[0] / (hora[1]/60); 
		else
		return hora[0];	
	}
lucasgarofolo

Já consegui galera, valeu :smiley:

lucasportela
linngallo:
Ops, desculpa, de fato, é uma classe minha.

Os métodos são mais ou menos assim:

public static Number nullAsZero(Number number) {
		return number == null ? 0 : number;
	}

public static String nullAsEmpty(String str) {
		return str = isFull(str) ? str : "";
	}

Nunca faça essa validação no método nullAsZero, pois há um 'bug' (se é que podemos chamar de bug) no operador ternário. Quando você compara um inteiro e um float, mesmo que o resultado seja um inteiro, ele retorna um float, pois ele eleva o valor para o Wrapper mais alto da comparação. Isso pode quebrar a aplicação.

[url]http://code.google.com/intl/en-UK/edu/languages/index.html#_java_puzzlers[/url]
Veja o 7º puzzle

Use o bom e velho 'if'

ViniGodoy

Eu vivo ressaltando isso no GUJ.

O operador ternário, como o próprio nome diz, é um operador matemático. Portanto ele:
a) Deve retornar um valor;
b) O valor deve ser de um, e apenas um, tipo definido.

Operador ternário não é um if.
Você não pode usa-lo com duas funções void.

E, como retorna resultado, este pode ser usado ao se invocar um método.

Criado 15 de junho de 2012
Ultima resposta 16 de jun. de 2012
Respostas 15
Participantes 10