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

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:

[code] 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:")));

[/code]

quando eu criei as váriaveis da classe bean eu criei cada elas como double e gerei os get e set.

[code]
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;
}

}[/code]

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

eu tentei desta forma:

[code]do {

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

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:

tenta isso

not1.equals(null)

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:

[code]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);

}

}[/code]

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.

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

Rodrigo Sasaki concordo também… up!

[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:

[code]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;
}

}[/code]

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

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

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)

[code]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);

}

}

[/code]

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.

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:[code]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;
}

}[/code]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.

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

desculpem a enchisão de saco.

seguinte eu segui o primeiro modelo.

[code]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 só tenha números, ou false, caso não tenha somente números. Se quiser, ela ainda valida se a string é null, dai só com esse método você valida se é nulo e se tem somente números, podendo retirar a validação anterior.[/code]

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:

[code]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;  
}  [/code]

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:

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;

Valeu agora intendi o como fazer.

Código acabou ficando da seguinte forma:

ex:

[code]
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;  
}  

}[/code]

[code]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);

}

}[/code]

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