Boa tarde galera, sou iniciante em java e estou com uma duvida:
no metodo editaPassageiro tenho uma instancia da classe Passageiro que chama o metodo pesquisaDePassageiro(): Passageiro passageiro = pesquisaDePassageiro();
Nesta declaração está dando um erro de incompatibilidade de tipos, no netbeans informa a seguinte mensagem: incompatibilidade de tipos requer sisnetBus.Passageiro e foi encontrado void. O que tenho que fazer para corrigir este erro??
[code]// metodo que edita o cadastro de passageiro
public static void editaPassageiro(){
// Chama o metodo que exibe uma tela para o usuario com a opção de pesquisar pelo CPF ou RG
Passageiro passageiro = pesquisaDePassageiro();
if (passageiro != null) {
JOptionPane.showMessageDialog(null, "Digite os dados para edição de pessoa física:", ">> Edita cadastro de passageiro <<", JOptionPane.INFORMATION_MESSAGE);
passageiro.nome = JOptionPane.showInputDialog("Digite o nome:", passageiro.nome);
passageiro.endereco = JOptionPane.showInputDialog("Digite o endereço:", passageiro.endereco);
passageiro.cpf = JOptionPane.showInputDialog("Digite o CPF:", passageiro.cpf);
passageiro.rg = JOptionPane.showInputDialog("Digite o RG:", passageiro.rg);
// exibe mensagem informando que a alteração do cadastro foi realizado com sucesso
JOptionPane.showMessageDialog(null, "Alteração realizada com sucesso!", ">> Edita cadastro de passageiro <<", JOptionPane.INFORMATION_MESSAGE);
//exibe a lista de passageiros cadastrados
listaDePassageirosCadastrados();
}
}
// metodo que será utilizado para tela de pesquisa de passageiro com a opção de pesquisa por cpf e rg
public static void pesquisaDePassageiro() {
// Exibe uma tela para o usuario com a opção de pesquisar pelo CPF ou RG
String mensagem = "Digite:\n";
mensagem = mensagem + "4- Pesquisar pelo nome do passageiro.\n";
mensagem = mensagem + "5- Pesquisar pelo CPF do passageiro.\n\n";
int acaoDoUsuario = Integer.valueOf(JOptionPane.showInputDialog(null, mensagem, "Entrada", JOptionPane.QUESTION_MESSAGE));
// Se o usuario digitar 4 será chamado o metodo comparaPassageiroPeloNome
if (acaoDoUsuario == 4) {
String nomeDoPassageiro = String.valueOf(JOptionPane.showInputDialog(null, "Digite o nome do passageiro:", "Entrada", JOptionPane.QUESTION_MESSAGE));
comparaPassageiroPeloNome(nomeDoPassageiro);
}
// Se o usuario digitar 5 será chamado o metodo comparaPassageiroPeloCpf
if (acaoDoUsuario == 5) {
String cpf = String.valueOf(JOptionPane.showInputDialog(null, "Digite o CPF do passageiro:", "Entrada", JOptionPane.QUESTION_MESSAGE));
comparaPassageiroPeloCpf(cpf);
}
}[/code]
[quote=glock]o metodo entendi, porem o objetoRetorno não ficou claro:
tenho que instanciar a classe Passageiro dentro do PesquisaPassageiro:
Passageiro objetoRetorno = new Passageiro();
este new Passageiro() terei que colocar os atributos da classe Passageiro?
return objetoRetorno;
este return utilizo ele no final do metodo PesquisaPassageiro?
[]'s[/quote]
seu problema esta nesta linha:
Passageiro passageiro = pesquisaDePassageiro();
passageiro ali se tornou uma variavel de instância, mas como você vai dar um valor a ela, se este método não te retorna nada?
este método precisa retornar um objeto Passageiro, ele não pode ser void, pra ser usado desta forma
por isso instancie um objeto Passageiro dentro do seu método, e retorne ele
Passageiro objetoRetorno = new Passageiro();
return objetoRetorno;
mudei o metodo método pesquisaDePassageiro() que não retornava nada para ele retorna:
public static Passageiro pesquisaDePassageiro()
Instanciei a classe Passageiro dentro do metodo pesquisaPassageiro
Passageiro objetoRetorno = new Passageiro();
Aqui nesta instancia está dando um erro: new Passageiro(), aqui dentro tenho que colocar o cpf e o nome?
E depois terei realizar a pesquisa(Nome ou CPF) e modificar os dados do objeto e retornar no final do metodo é isto? Se for como faço isto?
essa palavra reservada new é o acesso ao método construtor… na sua classe Passageiro deve haver um ou mais métodos construtores (polimorfia) para que se possa criar um objeto dessa classe. O que seu método pesquisaDePassageiro() deve fazer, é instanciar um novo objeto da classe Passageiro, pesquisar o passageiro que você quer, atribuir ao objeto que será retornado todos os atributos (Nome, CPF) por setter (ou polimorfismo do construtor) e então retornar esse objeto…
ao final disso, o objeto que é igual ao retorno do método (passageiro = pesquisaDePassageiro()) será idêntico ao objeto que foi retornado, com os mesmos atributos, e sem a necessidade de acessar o construtor novamente, já que o objeto retornado já foi construído
cara não entendi, poderia exemplificar para poder ficar mais claro?
pq dentro do meu metodo pesquisaDePassageiro() instaciei um novo objeto da classe Passageiro:
Passageiro objetoRetorno = new Passageiro(); porem dá um erro no Passageiro() pq tem que passar os valores, porem eu terei os valores quando entrar nos if que o usuario entrara com o nome ou cpf e os if irá dar um return comparaPassageiroPeloNome ou comparaPassageiroPeloCpf, ai dentro dos if terei que colocar o objetoRetorno tbm?
abaixo o metodo comparaPassageiroPeloNome e comparaPassageiroPeloCpf:
[code]
// metodo que irá comparar o nome do passageiro pelo nome fornecido pelo usuario
public static Passageiro comparaPassageiroPeloNome(String nomeDoPassageiro) {
int contador = 0;
for (int i = 0; i < passageiros.size(); i++) {
//obtem intens da lista passageiro
Passageiro passageiro = passageiros.get(i);
if (passageiro.nome.toUpperCase().equals(nomeDoPassageiro.toUpperCase())) {
contador++;
String mensagem = "---------------------------------------------------\n";
mensagem += "Nome: " + passageiro.nome + "\n";
mensagem += "Endereço: " + passageiro.endereco + "\n";
mensagem += "CPF: " + passageiro.cpf + "\n";
mensagem += "RG: " + passageiro.rg + "\n";
JOptionPane.showMessageDialog(null, mensagem, ">> Pesquisa pelo nome <<", JOptionPane.INFORMATION_MESSAGE);
}
}
if (contador == 0) {
JOptionPane.showMessageDialog(null, "Passageiro não encontrado!", ">> Pesquisa pelo nome <<", JOptionPane.INFORMATION_MESSAGE);
}
return null;
}[/code]
[code]// metodo que irá comparar o cpf do passageiro pelo cpf fornecido pelo usuario
public static Passageiro comparaPassageiroPeloCpf(String cpfDoPassageiro) {
int contador = 0;
for (int i = 0; i < passageiros.size(); i++) {
//obtem itens da lista passageiros
Passageiro passageiro = passageiros.get(i);
if (passageiro.cpf.equals(cpfDoPassageiro)) {
contador++;
String mensagem = "---------------------------------------------------\n";
mensagem += "Nome: " + passageiro.nome + "\n";
mensagem += "Endereço: " + passageiro.endereco + "\n";
mensagem += "CPF: " + passageiro.cpf + "\n";
mensagem += "RG: " + passageiro.rg + "\n";
JOptionPane.showMessageDialog(null, mensagem, ">> Pesquisa pelo cpf <<", JOptionPane.INFORMATION_MESSAGE);
}
}
if (contador == 0) {
JOptionPane.showMessageDialog(null, "Passageiro não encontrado!", ">> Pesquisa pelo cpf <<", JOptionPane.INFORMATION_MESSAGE);
}
return null;
}[/code]
public Passageiro(){
this.nome = "";
this.cpf = "";
// inicialize todos os atributos
}
// OU até mesmo, simplesmente:
public Passageiro(){} // método que não faz nada
isso serve simplesmente pra ele puxar na memória RAM, no espaço referencial do objeto, uma cópia dos dados contidos na classe Passageiro
depois eu falo que é bom aprender C++ OO antes de Java e ninguém entende o porquê (então fica a dica: se quiser saber como isso funciona fisicamente, www.cplusplus.com/doc/tutorial/classes/)
edit:
também tente pesquisar sobre escopo de variáveis em Java: se a variável objetoRetorno foi instanciada no método pesquisaDePassageiro(), assim que o método termina, a variável é apagada da memória para não sobrecarregar a RAM (processo conhecido como GarbageCollector)
edit2:
já que quer um pouquinho de prática:
[code]public static Passageiro pesquisaDePassageiro() { // isso com aquele construtor que postei acima na classe Passageiro
Passageiro ret = new Passageiro(); // guarda na RAM o objeto ret, com os atributos e métodos da classe Passageiro
ret.setCPF(“555555555-55”); // acessa método setter do atributo CPF, para dar um valor ao CPF
ret.setNome(“João”); // acessa método setter do atributo Nome. É claro que a classe Passageiro tem que ter os métodos mutator (setters)
return ret; // manda o objeto de volta pra quem chamou o método pesquisaDePassageiro()
}
public static void editaPassageiro() {
Passageiro passageiro = pesquisaDePassageiro(); // usamos o método pesquisaDePassageiro(), gravando seu retorno na variável passageiro
String cpf = passageiro.getCPF(); // declaramos uma String que usa o método acessor (getter) de CPF
String nome = passageiro.getNome(); // óbvio também, a classe Passageiro deve conter os métodos acessors
System.out.println("CPF: " + cpf);
System.out.println("Nome: " + nome);
}[/code]
o output disso na tela é:
555555555-55
João
se conseguiu entender isso, já é um bom caminho a entender algo maior .-.
cara vlw pela sua ajuda e as dicas, vi que dava para fazer de um modo diferente:
no metodo comparaPassageiroPeloNome e comparaPassageiroPeloCpf coloquei um return passageiro no final do if e deu certo.