Duvida quanto a valores nulos para variáveis numéricas usando orientação a objetos

13 respostas
C

Galara terminou o ano mas eu estou aproveitando para continuar estudando e arrumando mais problemas, ou pegando aquela lista de algoritimos que eram para fazer em java e agora fazendo eles com orientação a objeto.

Seguinte minha duvida acaba surgindo da seguinte forma:

No caso quando o usuário digitar um campo nota , este campo pode ter o valor "0" mas não pode ser nulo e é ai que surge o problema eu não sei como fazer isto.

ex:

not1Bean am = new AmBean();
		MsBean ms = new MsBean();
		not2Bean nac = new NacBean();
		ParcialBean parcial = new ParcialBean();
		not3Bean ps = new PsBean();
		SeisBean seis = new SeisBean();
		
		String nome;
		
		JOptionPane.showMessageDialog(null, "Calculadora de Notas" + 
				"\n\n"
				+ "Digite suas Notas."
				+ "\nSe precisar usar a virgula para casas Decimais de notas quebradas"
				+ "Por favor use o simbolo de ponto final!");
		
		do {
			
			nome = JOptionPane.showInputDialog(null, "Digite o seu Nome", "Pergunta!", JOptionPane.QUESTION_MESSAGE);
			
		} while (nome.equals(""));
		
		not1.setNac(Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a Sua Nota de NOTA 1:", "Pergunta!" , JOptionPane.QUESTION_MESSAGE)));
				
		not2.setAm(Double.parseDouble(JOptionPane.showInputDialog("Digite a Sua Nota de NOTA2:")));
quando eu criei as váriaveis da classe bean eu criei cada elas como
double
e gerei os get e set.
package com.calculadora.bean;

import java.io.Serializable;

public class Not1Bean implements Serializable {

	private static final long serialVersionUID = 1L;

	public NacBean() {
		
	}
	
	private double not1;

	public double getnot1() {
		return not1;
	}

	public void setnot1(double not1) {
		this.not1 = not1;
	}
	
	

}

Eu sei que parece ser bobo mas eu não estou conseguindo fazer está validação.

eu tentei desta forma:

do {
			
			not1.setNot1(Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a Sua Nota de nota 1:", "Pergunta!" , JOptionPane.QUESTION_MESSAGE)));
			
		} while (not1.equals(nac.getNot1("")));

mas não funciona e dá o seguinte erro:

The method getNot1() in the type Not1Bean is not applicable for the arguments (String)

Galera será que alguem consegue me dar uma mão?

de Ante mão valeu. :lol:

13 Respostas

charleston10

tenta isso

not1.equals(null)
C
Obrigado pela ajuda eu inclusive já tinha testado isto, o que ocorre é que quando se passa pela condição dentro do
do while
ele finaliza a aplicação e aparece o seguinte erro.
Exception in thread "main" java.lang.NumberFormatException: empty String
	at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
	at java.lang.Double.parseDouble(Unknown Source)
	at com.calculadora.teste.CalculadoraTeste.main(CalculadoraTeste.java:50)

O código de encontra da seguinte forma:

package com.calculadora.teste;

import java.io.Serializable;

import javax.swing.JOptionPane;

import com.calculadora.bean.AmBean;
import com.calculadora.bean.MsBean;
import com.calculadora.bean.NacBean;
import com.calculadora.bean.ParcialBean;
import com.calculadora.bean.PsBean;
import com.calculadora.bean.SeisBean;

public class CalculadoraTeste implements Serializable {

	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {

		AmBean am = new AmBean();
		MsBean ms = new MsBean();
		NacBean nac = new NacBean();
		ParcialBean parcial = new ParcialBean();
		PsBean ps = new PsBean();
		SeisBean seis = new SeisBean();
		
		String nome;
		String materia;
		
		JOptionPane.showMessageDialog(null, "Calculadora de Notas" + 
				"\n\n"
				+ "Digite suas Notas."
				+ "\nSe precisar usar a virgula para casas Decimais de notas quebradas"
				+ "Por favor use o simbolo de ponto final!");
		
		do {
			
			nome = JOptionPane.showInputDialog(null, "Digite o seu Nome", "NOME!", JOptionPane.INFORMATION_MESSAGE);
			
		} while (nome.equals(""));
		
		do {
			
			materia = JOptionPane.showInputDialog(null, "Digite a Matéria que você quer saber as Notas", "MATÉRIA!", JOptionPane.INFORMATION_MESSAGE);
			
		} while (nome.equals(""));
		
		do {
			
			nac.setNac(Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a Sua Nota de NAC:", "NAC!" , JOptionPane.INFORMATION_MESSAGE)));
			
		} while (nac.equals(null) );
			
		
				
		am.setAm(Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a Sua Nota de AM:", "AM!", JOptionPane.INFORMATION_MESSAGE)));
		
		ps.setPs(Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a sua Nota na PS", "PS!", JOptionPane.INFORMATION_MESSAGE)));
		
		parcial.setParcial((nac.getNac() * 0.2) + (am.getAm() * 0.3));
		
		System.out.println(parcial.getParcial());
		
		seis.setSeis((nac.getNac() * 0.2) + (am.getAm() * 0.2) - (6));
		
		System.out.println(seis.getSeis());
		
		ms.setMs((nac.getNac() * 0.2) + (am.getAm() * 0.3) + (ps.getPs() * 0.5));
		
		System.out.println(ms.getMs());
		
		JOptionPane.showMessageDialog(null, "Nome do Aluno: " + nome
				+ "\n\nMatéria: " + materia
				+ "\n\nNota de NAC: " + nac.getNac()
				+ "\nNota de AM: " + am.getAm()
				+ "\nNota de PS: " + ps.getPs()
				+ "\n\nMédia Parcial sem a PS: " + parcial.getParcial()
				+ "\nMédia Necessária para tirar 6 de média: " + seis.getSeis()
				+ "\nMédia Final: " + ms.getMs(), "Resumo da Notas", JOptionPane.INFORMATION_MESSAGE);

	}

}
Rodrigo_Sasaki

o problema está em tentar converter uma String vazia para número. Caso tente fazer isso essa exceção será lançada mesmo, a ideia é validar antes, assim:String nota = JOptionPane.showInputDialog(null, "Digite a Sua Nota de NAC:", "NAC!" , JOptionPane.INFORMATION_MESSAGE)); if(nota != null && !nota.trim().isEmpty()){ nac.setNac(Double.parseDouble(nota)); }E só a título de curiosidade, qualquer variável de tipo primitivo nunca tem valor null. Todas tem um valor default.

0 para os tipos numéricos e false para boolean, só existe a possibilidade de ter um valor nulo caso seja uma variável de referência, o que acontece com os Wrappers, por isso pode causar confusão.

charleston10
Exception in thread "main" java.lang.NumberFormatException: empty String

Rodrigo Sasaki concordo também… up!

C
[quote=Rodrigo Sasaki]o problema está em tentar converter uma String vazia para número. Caso tente fazer isso essa exceção será lançada mesmo, a ideia é validar antes, assim:[code]String nota = JOptionPane.showInputDialog(null, "Digite a Sua Nota de NAC:", "NAC!" , JOptionPane.INFORMATION_MESSAGE));  
if(nota != null && !nota.trim().isEmpty()){
    nac.setNac(Double.parseDouble(nota));
}
E só a título de curiosidade, qualquer variável de tipo primitivo nunca tem valor null. Todas tem um valor default.[/code]

0 para os tipos numéricos e false para boolean, só existe a possibilidade de ter um valor nulo caso seja uma variável de referência, o que acontece com os Wrappers, por isso pode causar confusão.[/quote]

Eu entendi o que você quis me dizer. Mas eu num sei se foi cabacise minha ou :

quando eu tento entrar com o código ex:

nac.trim()

a IDE no caso o eclipse da erro e não reconhece este código.

ele dá a seguinte mensagem:

The method trim() is undefined for the type NacBean

E também tinha me esquecido a criação por exemplo da classe Nac para aceitar está nota eu criaei da seguinte forma:

package com.calculadora.bean;

import java.io.Serializable;

public class NacBean implements Serializable {

	private static final long serialVersionUID = 1L;

	public NacBean() {
		
	}
	
	private double nac;

	public double getNac() {
		return nac;
	}

	public void setNac(double nac) {
		this.nac = nac;
	}
	
	

}
Rodrigo_Sasaki

eu invoquei o método trim() na String que eu defini. não na sua classe.

C

foi mal eu intendi o que você quis dizer agora que eu me toquei valeu há ajuda

C

Mas ai me surgiu uma duvida que eu já tinha que é a seguinte:

beleza eu consegui fazer com que funcione está condição.

mas a condição pode acontecer de ter uma segunda condição para a validação

como no caso que o campo não pode ser nulo por que se for automaticamente eu coloco o valor da váriavel como 0 beleza mas e se este usuário resolver digitar por exemplo uma letra por acidende o programa acaba parando também e ai o erro é o seguinte:

Exception in thread "main" java.lang.NumberFormatException: For input string: "as"
	at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
	at java.lang.Double.parseDouble(Unknown Source)
	at com.calculadora.teste.CalculadoraTeste.main(CalculadoraTeste.java:58)
package com.calculadora.teste;

import java.io.Serializable;

import javax.swing.JOptionPane;

import com.calculadora.bean.AmBean;
import com.calculadora.bean.MsBean;
import com.calculadora.bean.NacBean;
import com.calculadora.bean.ParcialBean;
import com.calculadora.bean.PsBean;
import com.calculadora.bean.SeisBean;

public class CalculadoraTeste implements Serializable {

	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {

		AmBean am = new AmBean();
		MsBean ms = new MsBean();
		NacBean nac = new NacBean();
		ParcialBean parcial = new ParcialBean();
		PsBean ps = new PsBean();
		SeisBean seis = new SeisBean();
		
		String nome;
		String materia;
		
		JOptionPane.showMessageDialog(null, "Calculadora de Notas FIAP" + 
				"\n\n"
				+ "Digite suas Notas."
				+ "\nSe precisar usar a virgula para casas Decimais de notas quebradas"
				+ "Por favor use o simbolo de ponto final!");
		
		//lopin para se entrar com o nome
		
		do {
			
			nome = JOptionPane.showInputDialog(null, "Digite o seu Nome", "NOME!", JOptionPane.INFORMATION_MESSAGE);
			
		} while (nome.equals(""));
		
		//lopin para se entrar com a matéria
				
		do {
			
			materia = JOptionPane.showInputDialog(null, "Digite a Matéria que você quer saber as Notas", "MATÉRIA!", JOptionPane.INFORMATION_MESSAGE);
			
		} while (materia.equals(""));
				
		//Condição para caso o usuário deixe o valor da nac como nulo		
		
		String nota1 = JOptionPane.showInputDialog(null, "Digite a Sua Nota de NAC:", "NAC!" , JOptionPane.INFORMATION_MESSAGE);
			
		if(nota1 != null && !nota1.trim().isEmpty()){  
		
			nac.setNac(Double.parseDouble(nota1));  
		
		}  
		
		//Condição para caso o usuário deixe o valor da am como nulo	
		
		String nota2 = JOptionPane.showInputDialog(null, "Digite a sua Nota de AM", "AM", JOptionPane.INFORMATION_MESSAGE);
		
		if (nota2 != null && !nota1.trim().isEmpty()){
			
			am.setAm(Double.parseDouble(nota2));
			
		}
		
		//Condição para caso o usuário deixe o valor da PS como nulo	
		
		String nota3 = JOptionPane.showInputDialog(null, "Digite a sua Nota na PS", "PS", JOptionPane.INFORMATION_MESSAGE);
		
		if (nota3 != null && !nota1.trim().isEmpty()){
			
			ps.setPs(Double.parseDouble(nota3));
			
		}
				
		parcial.setParcial((nac.getNac() * 0.2) + (am.getAm() * 0.3));
		
		System.out.println(parcial.getParcial());
		
		seis.setSeis((nac.getNac() * 0.2) + (am.getAm() * 0.2) - (6));
		
		System.out.println(seis.getSeis());
		
		ms.setMs((nac.getNac() * 0.2) + (am.getAm() * 0.3) + (ps.getPs() * 0.5));
		
		System.out.println(ms.getMs());
		
		JOptionPane.showMessageDialog(null, "Nome do Aluno: " + nome
				+ "\n\nMatéria: " + materia
				+ "\n\nNota de NAC: " + nac.getNac()
				+ "\nNota de AM: " + am.getAm()
				+ "\nNota de PS: " + ps.getPs()
				+ "\n\nMédia Parcial sem a PS: " + parcial.getParcial()
				+ "\nMédia Necessária para tirar 6 de média: " + seis.getSeis()
				+ "\nMédia Final: " + ms.getMs(), "Resumo da Notas", JOptionPane.INFORMATION_MESSAGE);

	}

}
R

Coloque esse metodo na sua classe:

/**
     * Este método checa se uma String contém somente números
     */
    public static boolean contemSomenteNumeros(String str) {
        
        //Não pode conter numero se for string...
        if (str == null || str.length() == 0)
            return false;
        
        for (int i = 0; i < str.length(); i++) {

            //se achou algum digita alfanumerico entao retorna false.
            if (!Character.isDigit(str.charAt(i)))
                return false;
        }
        
        return true;
    }

E use-o para validar se o usuario digitou somente numero. Mais ou menos dessa forma:

String nota1 = JOptionPane.showInputDialog(null, "Digite a Sua Nota de NAC:", "NAC!" , JOptionPane.INFORMATION_MESSAGE);  
              
        if(nota1 != null && !nota1.trim().isEmpty()){    
          if(contemSomenteNumero(nota1) {
             nac.setNac(Double.parseDouble(nota1));
          } else {
                 JOptionPane.showMessageDialog(null, "Informe somente numeros!");
          }
        }

O que esse metodo que te passei faz ?

Ele analisa cada parte da string e verifica se em todas foram inseridos somente numero, retornando true caso so tenha numeros, ou false, caso nao tenha somente numeros. Se quiser, ela ainda valida se a string é null, dai so com esse metodo voce valida se é nulo e se tem somente numeros, podendo retirar a validacao anterior.

Rodrigo_Sasaki
Bom, você pode criar um método utilitário, onde você verifica se a String está no formato que você quer, geralmente tratar por NumberFormatException ao tentar fazer um parse já resolve, veja o código:
public class Teste{

	public static void main(String[] args){
		System.out.println(isNumber("")); // false
		System.out.println(isNumber(null)); // false
		System.out.println(isNumber("as")); // false
		System.out.println(isNumber("4")); // true
		System.out.println(isNumber("4.6")); // false
	}
	
	public static boolean isNumber(String str){
		try{
			Integer.parseInt(str);
		}catch(NumberFormatException e){
			return false;
		}
		return true;
	}
	
}
Perceba também que nessa situação, 4.6 não é considerado um número, somente Strings que possuem um valor que pode ser atribuido a um int retornarão true.
C

Bom achei que o problema estava resolvido mas não está.

desculpem a enchisão de saco.

seguinte eu segui o primeiro modelo.

Coloque esse metodo na sua classe: 

view plaincopy to clipboardprint?
/** 
     * Este método checa se uma String contém somente números 
     */  
    public static boolean contemSomenteNumeros(String str) {  
          
        //Não pode conter numero se for string...  
        if (str == null || str.length() == 0)  
            return false;  
          
        for (int i = 0; i < str.length(); i++) {  
  
            //se achou algum digita alfanumerico entao retorna false.  
            if (!Character.isDigit(str.charAt(i)))  
                return false;  
        }  
          
        return true;  
    }  


E use-o para validar se o usuario digitou somente numero. Mais ou menos dessa forma: 

view plaincopy to clipboardprint?
String nota1 = JOptionPane.showInputDialog(null, "Digite a Sua Nota de NAC:", "NAC!" , JOptionPane.INFORMATION_MESSAGE);    
                
        if(nota1 != null && !nota1.trim().isEmpty()){      
          if(contemSomenteNumero(nota1) {  
             nac.setNac(Double.parseDouble(nota1));  
          } else {  
                 JOptionPane.showMessageDialog(null, "Informe somente numeros!");  
          }  
        }      



O que esse método que te passei faz ? 

Ele analisa cada parte da string e verifica se em todas foram inseridos somente numero, retornando true caso  tenha números, ou false, caso não tenha somente números. Se quiser, ela ainda valida se a string é null, dai  com esse método você valida se é nulo e se tem somente números, podendo retirar a validação anterior.

Só que o que acontece a condição só permite que o usuário digite valores inteiros. e os usuários podem digitar valores com notas quebradas.

tanto é que quando criei as classes bean contruí os objetos com variáveis do tipo double.

então eu tentei fazer o seguinte:

percebi que o for tinha um int então troquei para double:

public static boolean contemSomenteNumeros(String str) {  

		//Não pode conter numero se for string...  
		if (str == null || str.length() == 0)  
			return false;  

		for (double i = 0; i < str.length(); i++) {  

			//se achou algum digita alfanumerico entao retorna false. 
			
			if (!Character.isDigit(str.charAt((int) i)))  
				return false;  
		}  

		return true;  
	}

e fiz um cast dentro do ultimo if.

Agora ele passa pela validação. Mas ele avisa que só aceita dados numéricos encontrando erro.

A droga é que quando o usuário usa o simbolo de ponto ele está usando uma string, e ai é problema.

No final das contas eu não sei se vai dar certo.:wink:

R

Primeiro, voce nao precisa trocar o int do for para double , isso é so um contador!!. Deixe como int mesmo.

/**  
     * Este método checa se uma String contém somente números  
     */    
    public static boolean contemSomenteNumeros(String str) {    
            
        //Não pode conter numero se for string...    
        if (str == null || str.length() == 0)    
            return false;    
            
        for (int i = 0; i < str.length(); i++) {    
    
            //se achou algum digita alfanumerico entao retorna false.    
            if (!Character.isDigit(str.charAt(i)))    
                return false;    
        }    
            
        return true;    
    }

Para permitir virgulas e pontos, e so questao de logica mano. La no for, tem essa condicao

//se achou algum digita alfanumerico entao retorna false.    
            if (!Character.isDigit(str.charAt(i)))    
                return false;

O que essa condicao faz ? nao sei se voce entendeu, mas vou explicar. Essa condicao diz: Se o caractere que nessa posicao da string nao for digito numerico, retorna falso. O que voce pode fazer para permitir virgulas ou pontos é acrescentar,

Se o caractere que nessa posicao da string nao for digito numerico, E NAO FOR VIRGULA (OU PONTO), retorne falso

Exemplo para permitir ponto:

// Crie uma variavel do tipo String que ira receber o valor do char convertido em string.
String val = String.valueOf(str.charAt(i));

//se achou algum digita alfanumerico entao retorna false.    
if (!Character.isDigit(str.charAt(i)) && !val.equals("."))    
        return false;
C

Valeu agora intendi o como fazer.

Código acabou ficando da seguinte forma:

ex:
public class AmBean implements Serializable {

	private static final long serialVersionUID = 1L;

	public AmBean() {

	}
	
	private double am = 0;

	public double getAm() {
		return am;
	}

	public void setAm(double am) {
		this.am = am;
	}
	
	public static boolean contemSomenteNumeros(String str) {  

		//Não pode conter numero se for string...  
		if (str == null || str.length() == 0)  
			return false;  

		for (int i = 0; i < str.length(); i++) {

			String val = String.valueOf(str.charAt(i));

			//se achou algum digita alfanumerico entao retorna false.  
			if (!Character.isDigit(str.charAt(i)) && !val.equals(".")){
				
				return false; 
				
			}  
			 
		}  

		return true;  
	}  

}
classe teste:


		nota3 = JOptionPane.showInputDialog(null, "Digite a sua Nota na PS",null, JOptionPane.INFORMATION_MESSAGE);

		if (nota3 != null && !nota3.trim().isEmpty()){

			if (am.contemSomenteNumeros(nota3)){

				am.setAm(Double.parseDouble(nota3));

			}else{

				JOptionPane.showMessageDialog(null, "Informe Somente números!", null, JOptionPane.INFORMATION_MESSAGE);

			}

		}

		parcial.setParcial((nac.getNac() * 0.2) + (am.getAm() * 0.3));

		System.out.println(parcial.getParcial());

		seis.setSeis((nac.getNac() * 0.2) + (am.getAm() * 0.2) - (6));

		System.out.println(seis.getSeis());

		ms.setMs((nac.getNac() * 0.2) + (am.getAm() * 0.3) + (ps.getPs() * 0.5));

		System.out.println(ms.getMs());

		JOptionPane.showMessageDialog(null, "Nome do Aluno: " + nome
				+ "\n\nMatéria: " + materia
				+ "\n\nNota de NAC: " + nac.getNac()
				+ "\nNota de AM: " + am.getAm()
				+ "\nNota de PS: " + ps.getPs()
				+ "\n\nMédia Parcial sem a PS: " + parcial.getParcial()
				+ "\nMédia Necessária para tirar 6 de média: " + seis.getSeis()
				+ "\nMédia Final: " + ms.getMs(), "Resumo da Notas", JOptionPane.INFORMATION_MESSAGE);

	}

}
vou fazer só uma pergunta está condição de validação eu consigo colocar dentro de um
do while
?

por exemplo para a pessoa ficar preza dentro do lopin se por um acaso ela não fizer o que está sendo pedido na validação?

aqui eu tentei fazer.

mas o problema é que a pessoa entra dentro da minha condição e não sai mais mesmo que ela digite o valor correto

do{
			
		nota1 = JOptionPane.showInputDialog(null, "Digite a Sua Nota de NAC:",null, JOptionPane.INFORMATION_MESSAGE);
			
		}while (nota1 != null && !nota1.trim().isEmpty());  

			if(nac.contemSomenteNumeros(nota1)){

				nac.setNac(Double.parseDouble(nota1));  

			} else {  

				JOptionPane.showMessageDialog(null, "Informe somente numeros!",null, JOptionPane.INFORMATION_MESSAGE); 

			}

eu não sei sé é está a forma correta. Desta forma o usuário não consegue sair do lopin

Criado 23 de novembro de 2012
Ultima resposta 26 de nov. de 2012
Respostas 13
Participantes 4