[RESOLVIDO]Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

Bom dia pessoal.

Eu estou começando a mexer com vetores e matrizes, e em um código surgiu uma duvida.

Segue o código abaixo:

import javax.swing.JOptionPane;
import java.text.NumberFormat;
public class Exercicio0905 {
	public static void main(String[] args) {
		
		
		NumberFormat nf = NumberFormat.getCurrencyInstance();
		String dadosrelatorio = "";
		int nfunc = 0;
		double salariobruto = 0, inss = 0, irenda = 0, salarioliq = 0, totalsalb = 0, totalinss = 0, totalirenda = 0, totalsalliq = 0;
		
		while(true){
		String st = "Informe o número de funcionários";
		st = JOptionPane.showInputDialog(st);
		if (st == null){
			System.exit(0);
		}else if (st.equals("")){
			st = "Você deve informar um número";
			JOptionPane.showMessageDialog(null, st,"Erro",0);
			continue;
		}
		if (st.equals("0")){
			st = "Você deve informar um número maior que zero";
			JOptionPane.showMessageDialog(null, st,"Erro",0);
			continue;
		}
		
		nfunc = Integer.parseInt(st);

		String funcs[] = new String[nfunc];
				
		double dadosfunc[][] = new double[nfunc][3];
		
		for (int i = 1; i <= nfunc; i++){
			st = "Informe o nome do funcionário";
			st = JOptionPane.showInputDialog(st);
			if(st == null){
				st = "Você deve informar um nome!";
				JOptionPane.showMessageDialog(null, st,"Erro",0);
				continue;
			}else st.trim();
			if (st.length() < 2){
				st = "Nome deve conter pelo menos 2 caracteres";
				JOptionPane.showMessageDialog(null, st,"Erro",0);
				continue;
			}else funcs[i - 1] = st;
			
			do {
			st = "Informe seu salário bruto";
			st = JOptionPane.showInputDialog(st);
			if (st == null){
				System.exit(0);
			}else	if (st.equals("")){
					st = "Você deve informar um salário";
					JOptionPane.showMessageDialog(null, st,"Erro",0);
					continue;
			}else st.trim();
			
			salariobruto = Double.parseDouble(st);
			
			if(salariobruto < 465.00 ){
				st = "Salário deve ser maior ou igual a R$ 465.00";
				JOptionPane.showMessageDialog(null, st,"Erro",0);
				continue;
			}
			
			}while(salariobruto < 465.00);
			
			if (salariobruto <= 965.67){
				inss = salariobruto*8.0/100;
			} else if (salariobruto <= 1609.45){
				inss = salariobruto*9.0/100;
			}else if (salariobruto <= 3218.90){
				inss = salariobruto*11.0/100;
			}else if (salariobruto >3218.90){
				inss = 354.07;
			}
			
			if (salariobruto <= 1434.00){
				irenda = 0;
			}else if (salariobruto <= 2150.00){
				irenda = salariobruto*7.5/100;
			}else if (salariobruto <= 2886.00){
				irenda = salariobruto*15/100;
			}else if (salariobruto <= 3582.00){
				irenda = salariobruto*22.5/100;
			}else if (salariobruto > 3582.00){
				irenda = salariobruto*27.5/100;
			}
		
			salarioliq = salariobruto-inss-irenda;
			
			totalsalb += salariobruto;
			totalinss += inss;
			totalirenda += irenda;
			totalsalliq += salarioliq;
			
			dadosfunc [i -1][0]= salariobruto;
			dadosfunc [i -1][1]= inss;
			dadosfunc [i -1][2]= irenda;
			dadosfunc [i -1][3]= salarioliq;
			
			dadosrelatorio += funcs[ i -1] + " - " + nf.format(salariobruto) + " - " + nf.format(inss) + " - " + nf.format(irenda) + " - " + 
			nf.format(salarioliq) +"\n";			
		}
		String relatorio = "Resumo da folha de pagamento:\n\n\n" + dadosrelatorio + "\n\nTOTAIS: " + nf.format(totalsalb) + " - " + 
		nf.format(totalinss) + " - " + nf.format(totalirenda) + " - " + nf.format(totalsalliq); 		
		JOptionPane.showMessageDialog(null, relatorio,"Mensagem",1);
		break;
		}
		
	}

}

Criei uma matriz na linha 32, da maneira que está o código esta funcionando perfeitamente, porém ao começar o código eu fiz assim:

double dadosfunc[][] = new double[nfunc - 1][3];

Pesquisei sobre esse erro, e pelo que li eu estou indicando um lugar que não existe, mas se a matriz começa com [0][0], porque não funcionava e dava o erro “Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 0
at Exercicio0905.main(Exercicio0905.java:98)”.

Espero que entendam que apesar que eu consegui fazer o sistema rodar, não entendi o porque estava dando erro, e eu não quero ser uma máquina que programa dessa maneira porque simplesmente da certo, quero entender…

Fico no aguardo

Desde já agradeço!

Primeira coisa, pesquise sobre identação do código.
Seu código não está certinho, apesar que alguns pontos está correto neste aspecto.

Você não deixou claro seu erro. Está ocorrendo uma exception ArrayIndexOutOfBoundsException?

mas você ja corrigiu declarando

double dadosfunc[][] = new double[nfunc][3];  

ao inves de

double dadosfunc[][] = new double[nfunc - 1][3];  

?

Qual a sua dúvida exatamente?

[quote]Criei uma matriz na linha 32, da maneira que está o código esta funcionando perfeitamente, porém ao começar o código eu fiz assim:

double dadosfunc[][] = new double[nfunc - 1][3];

Nessa linha você não está acessando um valor de um array. Você está declarando e construindo um array. Portanto, caso fosse digitado 1 para o número de funcionários, seria o mesmo que fazer isso:

double dadosfunc[][] = new double[0][3];

Que é o mesmo que dizer para a JVM criar um array de 0 elementos que contenha outro array 3 elementos do tipo double.

Ao acessar os elementos de um array deve-se sempre começar a contagem pelo zero, mas, para construí-lo, o número inserido entre colchetes vai ser a quantidade de elementos daquele array. Quando você quiser declarar um array de 3 elementos deverá especificá-lo da seguinte forma:

int meuArray[] = new int[3];

E para acessar os três elementos deverá utilizar a seguinte indexação:

meuArray[0] = 1; meuArray[1] = 2; meuArray[2] = 3;
Ou seja, sua lógica funcionaria se você quisesse acessar o elemento [0][3] do array, mas criar um array com 0 elementos, e ainda atribuir outro array para ele, não é possível.

[quote=lsouza13]Primeira coisa, pesquise sobre identação do código.
Seu código não está certinho, apesar que alguns pontos está correto neste aspecto.

Você não deixou claro seu erro. Está ocorrendo uma exception ArrayIndexOutOfBoundsException?

mas você ja corrigiu declarando

double dadosfunc[][] = new double[nfunc][3];  

ao inves de

double dadosfunc[][] = new double[nfunc - 1][3];  

?

Qual a sua dúvida exatamente?[/quote]

Isso mesmo você entendeu a duvida, mas porque da segunda maneira, que foi da forma que iniciei o código, não funcionou?

[quote=di.magdaleno][quote]Criei uma matriz na linha 32, da maneira que está o código esta funcionando perfeitamente, porém ao começar o código eu fiz assim:

double dadosfunc[][] = new double[nfunc - 1][3];

Nessa linha você não está acessando um valor de um array. Você está declarando e construindo um array. Portanto, caso fosse digitado 1 para o número de funcionários, seria o mesmo que fazer isso:

double dadosfunc[][] = new double[0][3];

Que é o mesmo que dizer para a JVM criar um array de 0 elementos que contenha outro array 3 elementos do tipo double.

Ao acessar os elementos de um array deve-se sempre começar a contagem pelo zero, mas, para construí-lo, o número inserido entre colchetes vai ser a quantidade de elementos daquele array. Quando você quiser declarar um array de 3 elementos deverá especificá-lo da seguinte forma:

int meuArray[] = new int[3];

E para acessar os três elementos deverá utilizar a seguinte indexação:

meuArray[0] = 1; meuArray[1] = 2; meuArray[2] = 3;
Ou seja, sua lógica funcionaria se você quisesse acessar o elemento [0][3] do array, mas criar um array com 0 elementos, e ainda atribuir outro array para ele, não é possível.[/quote]

Obrigado por responder, mas não sei se entendi.

para acessar os elementos seria posição 0 = 1 correto?
mas para criar os elementos seria posição 1 = 1 ?

acho que estou confundindo essa inicialização em contagem 0 e 1…

Veja as explicações do di.magdaleno que entenderá como é a declaração do array, tamanho, etc.

Mas de qualquer maneira, teste o seguinte código para aprendizado:

public class A {

    void metodo(){
     
        int[] a = new int[0];
        a[0] = 6;
    }
}

Por que você acha que esse código acima não funciona? Tem ideia?

Agora, veja esse código também:

public class B {

    void metodo(){
     
        int[] a = new int[1];
        a[1] = 3;
    }
}

Por que esse segundo código também não funciona?

Se souber responder, é porque entendeu a explicação do di.magdaleno.

Se não entendeu, pode perguntar.

Agora entendi, como as vezes se complicamos com coisas tão simples rsrs.

O primeiro código não funciona porque não tem como criar um array sem “campos”.

O segundo não funciona porque a contagem sai de 0, ou seja, teria que ser a[0] = 3.

estou certo?

Obrigado pessoal, me ajudaram bastante, tenho que ficar atento quando vou inicializar o array e quando vou acessar os dados!

[quote=Artur Martini][quote=lsouza13]
Veja as explicações do di.magdaleno que entenderá como é a declaração do array, tamanho, etc.

Mas de qualquer maneira, teste o seguinte código para aprendizado:

public class A {

    void metodo(){
     
        int[] a = new int[0];
        a[0] = 6;
    }
}

Por que você acha que esse código acima não funciona? Tem ideia?

Agora, veja esse código também:

public class B {

    void metodo(){
     
        int[] a = new int[1];
        a[1] = 3;
    }
}

Por que esse segundo código também não funciona?

Se souber responder, é porque entendeu a explicação do di.magdaleno.

Se não entendeu, pode perguntar.
[/quote]

Agora entendi, como as vezes se complicamos com coisas tão simples rsrs.

O primeiro código não funciona porque não tem como criar um array sem “campos”.

O segundo não funciona porque a contagem sai de 0, ou seja, teria que ser a[0] = 3.

estou certo?

Obrigado pessoal, me ajudaram bastante, tenho que ficar atento quando vou inicializar o array e quando vou acessar os dados![/quote]

Isso mesmo!

Mas fica simples quando entendemos. Antes de entender, é complicado mesmo.
E aí temos que aprender juntos!

Valeu

É isso ai!

espero daqui um tempo estar do outro lado da moeda, podendo ensinar alguém, vlw!

eu tenho duvida na esse exercicio sou iniciante em programação não sei como começar

2 Construa uma classe que calcula o valor de um numero ao
quadrado e ao cubo. Escolha nomes para a classe e para
métodos que facilitem a compreensão de seu funcionamento…

gilmer
Pra começar, leia sobre programação orientada a objetos.
Uma sugestão é

Abs