Ler a partir do teclado

7 respostas
E

Estou tendo um problema estranho numa das linhas de leitura para dados do teclado. O código é o seguinte:

import java.util.*;

class Endereco {
    private String pais;
    private String cidade;
    private String estado;
    private String rua;
    private String bairro;
    
    public void setPais(String pais) { this.pais = pais; }
    public void setCidade(String cidade) { this.cidade = cidade; }
    public void setEstado(String estado) { this.estado = estado; }
    public void setRua(String rua) { this.rua = rua; }
    public void setBairro(String bairro) { this.bairro = bairro; }
    
    public String getPais() { return(pais); }
    public String getCidade() { return(cidade); }
    public String getEstado() { return(estado); }
    public String getRua() { return(rua); }
    public String getBairro() { return(bairro); }
}

class Aluno {
    private String nome;
    private String sexo;
    private int idade;
    private Endereco e;
    
    public void setNome(String nome) { this.nome = nome; }
    public void setSexo(String sexo) { this.sexo = sexo; }
    public void setIdade(int idade) { this.idade = idade; }
    public void setPais(String pais) { e.setPais(pais); }
    public void setCidade(String cidade) { e.setCidade(cidade); }
    public void setEstado(String estado) { e.setEstado(estado); }
    public void setRua(String rua) { e.setRua(rua); }
    public void setBairro(String bairro) { e.setBairro(bairro); }
    
    public String getNome() { return(nome); }
    public String getSexo() { return(sexo); }
    public int getIdade() { return(idade); }
    public String getPais() { return(e.getPais()); }
    public String getCidade() { return(e.getCidade()); }
    public String getEstado() { return(e.getEstado()); }
    public String getRua() { return(e.getRua()); }
    public String getBairro() { return(e.getBairro()); }
}

public class FichaAluno {
    public static void main(String args[]) {
        String nome, sexo, rua, bairro, comp;
        int idade, numero_casa;
        Aluno aluno = new Aluno();
        Scanner scan = new Scanner(System.in);
        
        System.out.println("Por favor, entre com os dados do aluno.");
        System.out.print("Nome: ");
        nome = scan.nextLine(); aluno.setNome(nome);
        System.out.print("Sexo: ");
        sexo = scan.nextLine(); aluno.setSexo(sexo);
        System.out.print("Idade: ");
        idade = scan.nextInt(); aluno.setIdade(idade);
        System.out.print("Rua: ");
        rua = scan.nextLine(); aluno.setRua(rua);
        
        nome = aluno.getNome();
        idade = aluno.getIdade();
        sexo = aluno.getSexo();
        System.out.println(nome+" - "+idade+" anos.");
        System.out.println(sexo);
    }
}
[color=red]java.lang.NullPointerException at Aluno.setRua(FichaAluno.java:35) at FichaAluno.main(FichaAluno.java:63)[/color]

Qual a explicação dessa falha? Onde está o ponteiro nulo?

7 Respostas

OliveirakunJava

Meu caro exploit, você está tentando usar um objeto que não existe, na seguinte linha:

private Endereco e;

Você está apenas declarando uma referência para um objeto(que até aqui não existe porque não foi instanciado). Então quando você chama este método:

aluno.setRua(rua);

Vai dar um NullPointerException porque sua variável e está apontando para um objeto nulo. Para resolver o problema faça o seguinte:

private Endereco e = new Endereco();

Ou se preferir, instancie o objeto dentro do construtor. Dessa forma sua variável estará apontando para um objeto que existe, e você não receberá mais um NullPoniterException.

Até mais, e boa sorte!

E

OliveirakunJava, muito obrigado pela ajuda. Aproveitando, você poderia me indicar algum tutorial sobre Encapsulamento, como você já pode perceber eu não manjo muito disso, o meu código teve de chamar novamente todas os sets e gets da classe Endereco para Aluno. Acredito que deva existir uma alternativa para evitar esse monte de repetições. Aceito suas sugestões.

[]s,
Exploit.

L

Exploit, entra no site da Caelum e baixa a apostila do FJ-11, acho que lá você vai achar o que precisa.

E

OK, vou dar uma olhada. Obrigado! :slight_smile:

OliveirakunJava

Exploit:
OliveirakunJava, muito obrigado pela ajuda. Aproveitando, você poderia me indicar algum tutorial sobre Encapsulamento, como você já pode perceber eu não manjo muito disso, o meu código teve de chamar novamente todas os sets e gets da classe Endereco para Aluno. Acredito que deva existir uma alternativa para evitar esse monte de repetições. Aceito suas sugestões.

[]s,
Exploit.

Como o amigo ai em cima disse, a apostila FJ-11 da Caelum é muito boa e cobre bem os fundamentos da linguagem java, como herança, encapsulamento, polimorfismo, etc. Se precisar de um material adicional, também recomendo o livro Use a cabeça Java da Kathy Sierra e do Bert Bates, que aborda os fundamentos da linguagem Java, de uma maneira prática e divertida.

Até a próxima e boa sorte nos estudos!

E

OK. Valeu :smiley:

B

No Java 6 existe classe Console, pode ajudar no futuro.

Criado 30 de agosto de 2009
Ultima resposta 1 de set. de 2009
Respostas 7
Participantes 4