Imposto de renda em Java [RESOLVIDO]

Estou com dificuldade em uma atividade da faculdade, onde devo criar uma aplicação de imposto de renda…
meu problema está na parte de printar as informações`import java.util.Scanner;

import java.util.Arrays;
public class AplicacaoImpostoDeRenda {

public static void main(String[] args) {
	Scanner input = new Scanner(System.in),
			inputstr = new Scanner(System.in);
	String descricao, nome, cpf;
	ImpostoDeRenda imposto;
	int operacao, repeticao=0;
	double renda, valor, soma=0;
	Deducao[] deducao = new Deducao[3];
	
	while(repeticao==0) {
	System.out.println(" _______________________________________________________\n"
			+         "|                                                                                                                |\n"
			+         "| 1 - Incluir Dedução                                                                                 |\n"
			+         "| 2 - Imprimir resumo da declaração de imposto de renda                       |\n"
			+         "|________________________________________________________|");
	operacao = input.nextInt();
	
	switch(operacao) {
	case 1:
		System.out.println("Nome: ");
		nome = inputstr.nextLine();
		System.out.println("Cpf: ");
		cpf = inputstr.nextLine();
		System.out.println("Renda Anual: ");
		renda = input.nextDouble();
		imposto = new ImpostoDeRenda(nome, cpf, renda);

		for(int i=0;i<3;i++) {
		    System.out.println("Descrição: ");
		    descricao = inputstr.nextLine();
		    System.out.println("Valor de dedução: ");
		    valor = input.nextInt();
		    soma=soma+valor;
		    Deducao deducoes = new Deducao(descricao, valor);
		    deducao[i]=deducoes;
		    imposto.inserirDeducao(deducao);
		}
		imposto.calculaImposto(soma);
		
		break;
	case 2:
		System.out.println(imposto.toString());
		
	}
  }

}

no caso no…
case 2:
System.out.println(imposto.toString());

		}

fico grato se alguém puder me ajudar…

Veja bem, você esta trabalhando com o objeto imposto, logo se você quiser “printar” os atributos como: nome, cpf e renda etc… você deverá chamar o metodo Get de cada tributo, entende?

Por exemplo:

System.out.println(imposto.getImpostoAPagar);

O toString() é uma representação em texto do seu objeto… toString() de Object retorna o nome da classe mais uma representação hexadecimal do código de
hash do seu objeto…Para alterar este comportamento caso você queira imprimir algo significativo você pode sobrescrever este método
no seu objeto:

@Override
public String toString(){
return “Teste”;
}

1 curtida

Entendo, obrigado!..

ele pede pra inicializar a variável imposto, mas já iniciei no case 1

teria que iniciar ela de novo no case 2? se sim, como ele vai executar se na classe imposto de renda tem um construtor?

Por favor coloca o conteúdo da sua classe imposto.

import java.util.Arrays;
public class ImpostoDeRenda {
private String nomeContribuinte;
private String cpf;
private double rendaAnual;
private Deducao[] deducoes;

public ImpostoDeRenda(String nomeContribuinte, String cpf, double rendaAnual) {
	setNomeContribuinte(nomeContribuinte);
	setCpf(cpf);
	setRendaAnual(rendaAnual);
	deducoes = new Deducao[3];
}
//-----------------------------------------------
public String getNomeContribuinte() {
	return nomeContribuinte;
}
public void setNomeContribuinte(String nomeContribuinte) {
	if(nomeContribuinte!=null && !nomeContribuinte.isEmpty()) {
	this.nomeContribuinte = nomeContribuinte;
	}
}
public String getCpf() {
	return cpf;
}
public void setCpf(String cpf) {
	if(cpf!=null && !cpf.isEmpty()) {
	this.cpf = cpf;
	}
}
public double getRendaAnual() {
	return rendaAnual;
}
public void setRendaAnual(double rendaAnual) {
	if(rendaAnual>0) {
	this.rendaAnual = rendaAnual;
	}
}
public Deducao[] getDeducoes() {
	return deducoes;
}
//--------------------------------------------------

public boolean inserirDeducao(Deducao[] dec) {
	
	if(dec!=null) {
		for (int i = 0; i < dec.length; i++) {
			if (deducoes[i] == null) {
				deducoes[i] = dec[i];
				break;
			}
			
		}
		return true;
	}else {
		return false;
	}
}

public double calculaImposto(double soma) {
	double IR,Aliquota;
	if(rendaAnual<=13968) {
		Aliquota=0;
		IR = ((rendaAnual-soma)*Aliquota);
	}else if(rendaAnual>13968.01 && rendaAnual<27912) {
		Aliquota=15/100;
		IR = ((rendaAnual-soma)*Aliquota);
	}else {
		Aliquota=27.5/100;
		IR = ((rendaAnual-soma)*Aliquota);
	}
	
	
	return IR;
}

public String toString() {
	return "Nome: "+getNomeContribuinte()+"\n"
	     + "Cpf: "+getCpf()+"\n"
	     + "Renda Anual: "+getRendaAnual()+"\n"
	     + "Deduções: "+Arrays.toString(getDeducoes())+"\n";
}

}

Amigo,

Você deve inicializar a variável ImpostoDeRenda imposto antes dos cases. Ou melhor, antes do Switch,

Pense o seguinte. Caso não entre em Case 1 a sua variável não será inicializada, certo? Logo, seu case 2 apresentará erro.

Na verdade você nem conseguirá rodar até que inicialize esta variável, pois o compilador irá acusar a não inicialização.

É necessário garantir que uma variável local seja inicializada em todo o escopo do método. Se vc não entrar no caso 1, sua variável não foi inicializada.

uma sugestão seria colocar a variável fora[quote=“Cafeeiro, post:1, topic:357772”]
ImpostoDeRenda imposto;
[/quote]

ImpostoDeRenda imposto = null;

Resolve seu problema sem alterar o que já foi feito.

1 curtida

Dessa forma @raphaeloneves , quando entrar no case 2 estará tentando pegar uma propriedade de um objeto nulo
case 2:
System.out.println(imposto.toString());
}

E vai apresentar o nullpointer

1 curtida

Falta de atenção minha! Desculpe. @edumatias

2 curtidas

nisso que pensei mesmo, mas obg pela ajuda galera!

resolvi, obrigado galera!