[RESOLVIDO]Retorno não funciona

Fala galera do GUJ blzera?
o que acontece é que encapsulei (acredito que certo) e criei os métodos para conseguir escrever nos atributos.
Mais no retorno os valores vem todos como zero, ou seja, pelo o que eu vi não consigo pegar o que tem naqueles atributos, o sistema é pra cadastrar um Celetista ou Pessoa Jurídica.
os códigos são esses.
Desculpe se fiz muita coisa e era mais simples que isso. eu tenho ainda que cadastrar os nomes, mais isso não é complicado, quero só conseguir fazer essas partes retornarem os valores corretos.

Obs: Pra quem quiser entender o Exercício, ele está em Anexo, obrigado desde já. Eu também não consegui usar o Construtor para inicializar os dados.l

package Colaboradores; public class Principal { public static void main(String[] args){ Menu menu=new Menu(); menu.Menu1(); } }

[code]package Colaboradores;

import java.util.Scanner;

public class Menu {

public void Menu1() {
    Scanner in = new Scanner(System.in);//Instanciar o Scanner para ler os dados
    String opcao;
    int escolha1 = 3;
    int escolha2 = 3;
    while ((escolha1 != 0) && (escolha1 != 1) && (escolha1 != 2)) {//Retornar ao Menu
        //****************************MENU**************************
        System.out.println("Escolha uma das seguintes Opções");
        System.out.println("1 - Celetista");
        System.out.println("2 - Pessoa Jurídica");
        System.out.println("0 - Sair");
        System.out.println("\n");
        //************************Fim do MENU***********************

        opcao = in.nextLine();//Ler opção do Menu
        escolha1 = Integer.parseInt(opcao);//Converter opção do Menu

        /*-------------------------------------------------------
         *------------------OPÇÂO CELETISTA---------------------- 
         *-----------------------------------------------------*/


        if (escolha1 == 1) {//CELETISTA
            do {
                Celetista cel = new Celetista();
                //****************MENU*************
                System.out.println("\nEscolha uma das seguintes Opções - ---CELETISTA---");
                System.out.println("1 - Alterar o valor do pagamento");
                System.out.println("2 - Calcular pagamento");
                System.out.println("0 - Sair");
                //***********FIM DO MENU***********

                opcao = in.nextLine();//Ler Opção do Menu
                escolha2 = Integer.parseInt(opcao);//Converter Opção do Menu


                if (escolha2 == 1) {//Alterar o valor Mensal - CELETISTA
                    System.out.println("Alterar Valor Mensal");
                    String valor1;
                    double valor = 0;
                    System.out.print("Digite o valor para alterar: ");
                    valor1 = in.nextLine();//Ler o valor para alterar
                    valor = Double.parseDouble(valor1);//Converter o valor para alterar
                    cel.alterarSalarioMensal(valor);//chama método para alterar o salário
                    escolha2 = 5;//retorna para o MENU ANTERIOR
                }//if Alterar valor
                else if (escolha2 == 2) {//Calcular pagamento - CELETISTA
                    String valorS;
                    double valor;
                    double liquido;

                    System.out.println("Qual o número de horas trabalhadas? ");
                    valorS = in.nextLine();//Ler o valor de horas trabalhadas
                    valor = Double.parseDouble(valorS);//converte o valor
                    liquido = (valorBrutoCeletista(valor) - cel.INSS() - cel.IRRF());//Pega o salário Líquido do Celetista

                    System.out.println("O salário Mensal é: " + cel.salarioMensal());//Mostra o Salário Mensal
                    System.out.println("O Valor Bruto é: " + valorBrutoCeletista(valor));//Mostra o Salário Bruto
                    System.out.println("O Valor do imposto IRRF é: " + cel.IRRF());//Mostra o Imposto IRRF
                    System.out.println("O Valor do imposto INSS é: " + cel.INSS());//Mostra o Imposto INSS
                    System.out.println("O Valor do Líquido é: " + liquido);//Mostra o Salário Líquido
                    escolha2 = 5;//volta para o Menu Anterior
                }//if Calcular pagamento
                else if (escolha2 == 0) {//Opção Sair
                    System.out.println("Opção 0");
                }//if Sair
                else if ((escolha2 != 2) && (escolha2 != 1) && (escolha2 != 0) && (escolha2 != 5)) {//Opção Inválida
                    System.out.println("Opção Inválida, favor escolher uma das opções!\n\n\n\n\n\n\n");
                }//if Opção Inválida
            } while ((escolha1 != 0) && (escolha1 != 1) && (escolha1 != 2));//retorna para o Menu
        }//Fim do Celetista

        /*-------------------------------------------------------
         *----------------FIM OPÇÃO CELETISTA--------------------
         *-----------------------------------------------------*/



        /*-------------------------------------------------------
         *---------------OPÇÂO Pessoa Jurídica------------------- 
         *-----------------------------------------------------*/

        if (escolha1 == 2) {//Pessoa Jurídica
            do {
                PessoaJuridica pj = new PessoaJuridica();//Instanciação
                //****************MENU*************
                System.out.println("\nEscolha uma das seguintes Opções - ---PJ---");
                System.out.println("1 - Alterar o valor do pagamento");
                System.out.println("2 - Calcular pagamento");
                System.out.println("0 - Sair");
                //***********FIM DO MENU***********

                opcao = in.nextLine();//Ler Opção do Menu
                escolha2 = Integer.parseInt(opcao);//Converter Opção do Menu


                if (escolha2 == 1) {//Alterar o valor das Horas - PJ
                    System.out.println("Alterar Valor das horas");
                    String valor1;
                    double valor = 0;
                    System.out.print("Digite o valor para alterar: ");
                    valor1 = in.nextLine();//Ler o valor da hora
                    valor = Double.parseDouble(valor1);//converter o valor da hora
                    pj.alterarValorHora(valor);//chama o método que altera o valor da hora
                    escolha2 = 5;//retorna para o Menu anterior
                }//if Alterar valor
                else if (escolha2 == 2) {//Calcular pagamento - PJ
                    String valorS;
                    double valor;
                    double liquido;

                    System.out.println("Qual o número de horas trabalhadas? ");
                    valorS = in.nextLine();//Ler o valor de horas trabalhadas
                    valor = Double.parseDouble(valorS);//converte o valor
                    liquido = (valorBrutoPJ(valor) - pj.ISS() - pj.IRRF() - pj.PIS());//Pega o salário Líquido do Celetista

                    System.out.println("O Valor Bruto é: " + valorBrutoPJ(valor));//Mostra o Salário Bruto
                    System.out.println("O Valor do imposto IRRF é: " + pj.IRRF());//Mostra o Imposto IRRF
                    System.out.println("O Valor do imposto INSS é: " + pj.ISS());//Mostra o Imposto ISS
                    System.out.println("O Valor do imposto PIS é: " + pj.PIS());//Mostra o Imposto PIS
                    System.out.println("O Valor do Líquido é: " + liquido);//Mostra o Salário Líquido
                    escolha2 = 5;//volta para o Menu Anterior
                }//if Calcular pagamento
                else if (escolha2 == 0) {//Opção Sair
                    System.out.println("Opção 0");
                }//if Sair
                else if ((escolha2 != 2) && (escolha2 != 1) && (escolha2 != 0) && (escolha2 != 5)) {//Opção Inválida
                    System.out.println("Opção Inválida, favor escolher uma das opções!\n\n\n\n\n\n\n");
                }//if Opção Inválida
            } while ((escolha2 != 0) && (escolha2 != 1) && (escolha2 != 2));//retorna para o Menu
        }//Fim do PJ
    }
}

public double valorBrutoCeletista(double valor) {

    Colaborador col = new Colaborador();
    Celetista cel = new Celetista();
    double salario = 0;
    double salarioHora;
    if (col.mostraHorasMensal(valor) <= 160) {
        salario = cel.salarioMensal();
    }
    if (col.mostraHorasMensal(valor) >= 161) {
        salarioHora = cel.salarioMensal() / 160;
        salario = salarioHora * cel.salarioMensal();
    }

    return salario;
}

public double valorBrutoPJ(double valor) {
    Colaborador col = new Colaborador();
    PessoaJuridica pj = new PessoaJuridica();
    double salario = 0;
    salario = pj.mostraValorHora() * col.mostraHorasMensal(valor);
    return salario;
}

}[/code]

[code]package Colaboradores;

import java.util.Scanner;

public class Colaborador {

private String nome;
private String endereco;
private String telefone;
private double horasTrabalhadas;

public Colaborador() {
}

public void incluir() {
    Scanner in = new Scanner(System.in);
    String horas;
    System.out.print("Digite o Nome: ");
    this.nome = in.nextLine();
    System.out.print("Digite o Endereço: ");
    this.endereco = in.nextLine();
    System.out.print("Digite o Telefone: ");
    this.telefone = in.nextLine();
    System.out.print("Digite a quantidade de horas trabalhadas no Mês:  ");
    horas = in.nextLine();
    this.horasTrabalhadas = Double.parseDouble(horas);
}

public void imprimir() {
    System.out.println(this.nome);
    System.out.println(this.endereco);
    System.out.println(this.telefone);
    System.out.println(this.horasTrabalhadas);
}

public double mostraHorasMensal(double horasTrabalhadas) {
    this.horasTrabalhadas = horasTrabalhadas;
    return this.horasTrabalhadas;
}

}[/code]

[code]package Colaboradores;
import java.util.Scanner;

public class Celetista extends Colaborador{
private String RG;
private String CPF;
private double salarioMensal;

public Celetista(){
   
}

public void incluirCeletista(){
Scanner in=new Scanner(System.in);
String salario;
System.out.print("Digite o RG: ");
this.RG=in.nextLine();
System.out.print("Digite o CPF: ");
this.CPF=in.nextLine();
System.out.print("Digite o Salário Mensal: ");
salario=in.nextLine();
this.salarioMensal=Double.parseDouble(salario);
}

public void imprimirCeletista(){
System.out.println(this.RG);
System.out.println(this.CPF);
System.out.println(this.salarioMensal);
}

public double IRRF(){
   double impostoIRRF=0;
    if(this.salarioMensal<1499.15){
        impostoIRRF=0;
    }
    else if((this.salarioMensal>=1499.16)&&(this.salarioMensal<=2246.75)){
        impostoIRRF=((this.salarioMensal/100)*7.5)-112.43;
    }
    else if((this.salarioMensal>=2246.76)&&(this.salarioMensal<=2995.70)){
        impostoIRRF=((this.salarioMensal/100)*15)-280.94;
    }
    else if((this.salarioMensal>=2995.71)&&(this.salarioMensal<=3743.19)){
        impostoIRRF=((this.salarioMensal/100)*22.5)-502.72;
    }
    else{
        impostoIRRF=((this.salarioMensal/100)*27.5)-692.78;
    }
   return impostoIRRF;

}

public double INSS(){
   double imposto=0;
    if(this.salarioMensal<=965.67){
        imposto=(this.salarioMensal/100)*8;
    }
    else if((this.salarioMensal<=965.68)&&(this.salarioMensal<=1609.45)){
        imposto=(this.salarioMensal/100)*9;
    }
    else{
        imposto=(this.salarioMensal/100)*11;
        if(imposto>354.08){
            imposto=354.08;
        }
    }
    return imposto;

}

public void alterarSalarioMensal(double valor) {
    this.salarioMensal = valor;
}

public double salarioMensal(){
   return this.salarioMensal;

}
}
[/code]

[code]package Colaboradores;

import java.util.Scanner;

public class PessoaJuridica extends Colaborador {

private String CNPJ;
private double valorHora;
private double valorBruto;

public void incluirPJ() {
    Scanner in = new Scanner(System.in);
    String hora;

    System.out.print("Digite o CNPJ: ");
    this.CNPJ = in.nextLine();
    System.out.print("Digite o Valor por Hora: ");
    hora = in.nextLine();
    this.valorHora = Double.parseDouble(hora);
}

public void imprimirPJ() {
    System.out.println(this.CNPJ);
    System.out.println(this.valorHora);
}


public double IRRF() {
    double imposto = 0;
    imposto = (this.valorBruto / 100) * 1.5;
    return imposto;
}

public double PIS() {
    double imposto = 0;
    if (this.valorBruto > 5000) {
        imposto = (this.valorBruto / 100) * 4.65;
    }
    return imposto;
}

public double ISS() {
    double imposto = 0;
    if (this.valorBruto > 5000) {
        imposto = (this.valorBruto / 100) * 4;
    }
    return imposto;
}

public void alterarValorHora(double valor){
    this.valorHora=valor;
}
public double mostraValorHora(){
    return this.valorHora;
}

}
[/code]

Qual dos returns esta com problema???

na vdd são todos, ele retorna, mais manda o valor 0.0

cara ta uma confusao, em pessoa juridica tu ta retornando o valorBruto que nem foi instanciado ou seja eh null

pq voce nao usa os methods nextInt() para inteiro, nextDouble para ponto flutuante ao invez de nextLine()

[quote=Jonhkr]cara ta uma confusao, em pessoa juridica tu ta retornando o valorBruto que nem foi instanciado ou seja eh null

pq voce nao usa os methods nextInt() para inteiro, nextDouble para ponto flutuante ao invez de nextLine()[/quote]

outra coisa use os setter and getters para os parametros fica mais bonito :slight_smile:

Por que é errado usar esses métodos.

Toda entrada do console termina com o caracter de quebra de linha. Esses métodos deixam esse caracter no buffer. É isso que faz com que eles inexplicavelmente não funcionem de vez enquando. Para ler do console, o único método 100% confiável é mesmo o nextLine().

Cuidado que essa linha está dentro do while:

 Celetista cel = new Celetista();  

Isso significa que a cada loop, sua variável ce1 será apagada e substituída por um novo celetista.
Verifique se é isso mesmo que você quer fazer (provavelmente não, você deveria colocar essa linha antes do do, não depois).

[quote=ViniGodoy]Cuidado que essa linha está dentro do while:

 Celetista cel = new Celetista();  

Isso significa que a cada loop, sua variável ce1 será apagada e substituída por um novo celetista.
Verifique se é isso mesmo que você quer fazer (provavelmente não, você deveria colocar essa linha antes do do, não depois).[/quote]

mais isso não faria diferença eu acredito, (Testei aqui e não funcionou) mais realmente é pra criar ele assim que entrar na opção, já corrigi este problema.
o único problema é esses retornos que me voltam sempre 0.0

o método que to usando nextLine() e depois convertendo acredito que esteja correto pois não da erro nenhum na hora da compilação.
tah complicado olhei várias vezes, lembrando galera so novo em JAVA começei faz uns 3 meses. Desculpe a bagunça kkk Até eu me perco no código que fiz, acredito que irei melhorar com o tempo.

Por que é errado usar esses métodos.

Toda entrada do console termina com o caracter de quebra de linha. Esses métodos deixam esse caracter no buffer. É isso que faz com que eles inexplicavelmente não funcionem de vez enquando. Para ler do console, o único método 100% confiável é mesmo o nextLine().[/quote]

sim as vezes eles nao funcionam mas justamente por que o caracter \n esta no buffer

para que funcione corretamente basta chamar o nextLine() ai ele zera o buffer

Faria pq o new zeraria a variável. E você teria a impressão que o return não está funcionando, quando na verdade está.
Aliás, com certeza o return funciona. Isso é um recurso tão básico e elementar da linguagem, que não é ele o problema.

Já tentou rodar seu programa passo-a-passo?

Faria pq o new zeraria a variável. E você teria a impressão que o return não está funcionando, quando na verdade está.
Aliás, com certeza o return funciona. Isso é um recurso tão básico e elementar da linguagem, que não é ele o problema.

Já tentou rodar seu programa passo-a-passo?
[/quote]

Vini desculpa, mais ainda não aprendi a rodar passo-a-passo, iso se chama debugar? pois ainda não aprendi isso, aliás, consegui ter um retorno, apenas do celetista, o que mudei foi o seguinte, em cada parte do menu, tem um escolha2=5; isso é pra reternar ao menu anterior, aí coloquei ele no while lá em baixo, e também coloquei a instância em cima do do{ como você me disse e me retornou os resultados esperados, mas fiz a mesma coisa em PJ e não funcionou, deve ter algo errado aqui, estou analisando pra ver certinho o que possa estar errado, métodos e tudo mais.

Tem algum problema na hora do retorno eu usar o this. ?
Ex: return this.horasTrabalhadas;

pq estava lendo e em alguns lugares não tem o this

Galera eu consegui resolver o problema agora está retornando tudo certinho, o que havia de errado era a instanciação, obrigado vini, assim que mudei ela funcionou.
Outra coisa também, eu joguei os métodos brutos pra dentro de cada classe pra não ficar tudo em uma só, e também estava com problemas na instanciação do valor bruto, então criei um atributo com o nome valorBruto pra guardar esse valor, pra mas tarde eu poder retorná-lo. agora eu tenho que terminar ele. Aprendi muito fazendo isso, obrigado pela a ajuda a todos que tentaram me ajudar.

Rapaz, tá passando de hora de você aprender. Você usa o Netbeans ou o Eclipse? O depurador é a principal ferramenta de detecção de erros do programador. No estágio que você está, é uma boa aprender a usa-lo, pois você vai ver em detalhes como o Java funciona e onde estão os erros do seu código. Recomendo fortemente que você aprenda. Vai auxiliar muito nos seus estudos.

[quote=luis_serra]
Tem algum problema na hora do retorno eu usar o this. ?
Ex: return this.horasTrabalhadas;

pq estava lendo e em alguns lugares não tem o this[/quote]

Não tem problema. Mas a recomendação da linguagem é, de maneira geral, evitar palavras desnecessárias. O this só é realmente necessário se há shadowing, ou seja, se sua função declara um parâmetro exatamente com o mesmo nome de um atributo de sua classe. Isso tipicamente ocorre em métodos setters e construtores:

public void setNome(String nome) { this.nome = nome; //O atributo "nome" da classe recebe o parâmetro "nome" da função }

Rapaz, tá passando de hora de você aprender. Você usa o Netbeans ou o Eclipse? O depurador é a principal ferramenta de detecção de erros do programador. No estágio que você está, é uma boa aprender a usa-lo, pois você vai ver em detalhes como o Java funciona e onde estão os erros do seu código. Recomendo fortemente que você aprenda. Vai auxiliar muito nos seus estudos.

[quote=luis_serra]
Tem algum problema na hora do retorno eu usar o this. ?
Ex: return this.horasTrabalhadas;

pq estava lendo e em alguns lugares não tem o this[/quote]

Não tem problema. Mas a recomendação da linguagem é, de maneira geral, evitar palavras desnecessárias. O this só é realmente necessário se há shadowing, ou seja, se sua função declara um parâmetro exatamente com o mesmo nome de um atributo de sua classe. Isso tipicamente ocorre em métodos setters e construtores:

public void setNome(String nome) { this.nome = nome; //O atributo "nome" da classe recebe o parâmetro "nome" da função }[/quote]

É, eu percebi isso, irei tentar ao máximo economizar palavras, e sobre o Debug irei ir atraz pra ver como funciona, eu já li um pouco, mais vo ir atraz pra aprender a fazer exatamente correto. Obrigado mais uma vez cara.