Java.lang.ArrayIndexOutOfBoundsException: 4

3 respostas
V

Olá tenho que entregar este trabalho na faculdade hj e estou apanhando feio.
Olhem só :

Ele está somando as notas das matérias..
e se colocar mais de 2 alunos ele só faz de um aluno não faz do 2º e da a mensagem java.lang.ArrayIndexOutOfBoundsException: 4

Olhem como está:

[color=green][/color]
package avaliacao;

import aluno.*;
import javax.swing.*;
/**
 * <h1 style ="color: blue"> class Avaliacao</h1>
 * Esta classe e respónsavel por guardar</br> 
 * calculos da avaliacao do aluno como</br>
 * nota, total e media</br>
 * @name class Avaliacao
 * @access public
 */
public class Avaliacao {

	public float nota[] =new float [4];
	public float total = 0;
	public float media[] = new float[4];
	int c = 0;
	int m = 0;
	int n = 0;

	/**Responsável por buscar dados e calcular a media dos alunos</br>
	 * com as notas digitadas
	 * @name mediaAluno()
	 * @access public
	 * @type float
	 * @return mediaAluno()
	 */
	public float mediaAluno() {
		JOptionPane.showMessageDialog(null,"Calculo da media do aluno(a): "+Aluno.nome[m]);
			for (c = 0; c<=Aluno.qtdAluno; c++) {
				for (m =0; m<=Aluno.materia.length; m++) {
					for (n=0;n<4;n++) {
						nota[n] = Float.parseFloat(JOptionPane.showInputDialog("Digite a "+(n+1)+"ª nota de " +Aluno.materia[m]+ " do(a) aluno(a) "+Aluno.nome[c]));
						total += nota[n];
						media[n] = total/4; 
						System.out.println("total nota de " + Aluno.materia[m] + total);
						System.out.println("media de " + Aluno.materia[m]+ media[n]);
						//break;
					}	
				}
			}
		return mediaAluno();
	}
}
[color=olive][/color]
package aluno;
import menu.Menu;
import avaliacao.Avaliacao;

public class Programa {

	
	private static Avaliacao av;

	/**
	 * @param args
	 */
	public static void main (String []args) {
		Menu menu = new Menu();
		av = new Avaliacao();
		 
		menu.MenuPrograma();
		return;
	}
}
[color=green][/color]
package menu;
import javax.swing.JOptionPane;
import aluno.*;
import avaliacao.*;

public class Menu {

	public int opcao =0;
	Aluno al = new Aluno();
	Avaliacao av = new Avaliacao();
	
	/**
	 * 
	 * @return
	 */
	public String MenuPrograma() {
		opcao = Integer.parseInt(JOptionPane.showInputDialog( "--SISPRO-- MENU OPCÕES:\n1-CADASTRA;\n2-SAIR;\n3-relatorio.\n digite sua opcao."));
		while (opcao !=0) {	
			switch (opcao) {
				case 1:
					if (al.qtdAluno() == 0){
						al.qtdAluno();
					} else {
						al.cadastraAluno();
						av.mediaAluno();
						al.frequencia();
						al.aprovacao();
						MenuPrograma();
					}
					break;
				case 2:
					al.sair();
					return al.sair();
				case 3:
					int resp = 0;
					//al.relatorio();
					resp = Integer.parseInt(JOptionPane.showInputDialog("Deseja Voltar ao Menu?\n 1-SIM\n 2-NÃO: "));
					if (resp == 1) {
						MenuPrograma();
					//break;
					} else {
						return al.sair();
					}
					//break;
				default: JOptionPane.showMessageDialog(null, "Valor invalido, Tente novamente.");
				return MenuPrograma();
			}
		}
		return null;
	}
}
[color=olive][/color]
package aluno;

import javax.swing.JOptionPane;
/**
 * <h1 style ="color: blue"> class Aluno</h1>
 * Esta classe e respónsavel por guarda</br> as principais
 * informações dos alunos como</br>
 * nome, matricula, materias
 * e principais funções</br>
 * cadastrar, pesquisar e sair.
 * @name class Aluno
 *  @access public 
 * @author  700424Marcos, 0700499Taís, 0700542Vanessa
 * @version 0.0.3
 */
public class Aluno {
	
	public static String nome[] = new String[5];
	public int matricula = 0;
	public static String materia[] = { "Portugues", "Matematica", "Ciencias", "Estudos Sociais" };
	public float nota[][] = new float[10][10];
	public float media[][] = new float[10][10];
	public float diaAula[] = new float[4];
	public float frequencia[] = new float[4];
	public float diaFalta[] = new float[4];
	public float falta[] = new float[4];
	public static int qtdAluno = 0;
	public float total;
	int c, n, i, m = 0;
	 /**
	 * principal função saber quantos alunos o usuário quer cadastrar</br>
	 * Caso seja digitado um valor invalido retornara uma mensagem de erro.
	 * @name qtdAluno()
	 * @access public
	 * @type int
	 * @since
	 * 
	 * */  

	public int qtdAluno() {
		qtdAluno = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de alunos para cadastro"));
		c = qtdAluno;
		System.out.println("Quantidade " + c);
		if (qtdAluno == 0) {
			JOptionPane.showMessageDialog(null, "Quantidade inválida");
			qtdAluno();
		} else {

		}
		return c;
	}
	 /**
	 * Responsavel por guardar os dados digitados pelo usuário</br>
         * como nome do aluno, quantidade de aluno, matérias.
	 * @name cadastraAluno()
	 * @access public
	 * @type String[]
	 * @return nome
	 * 
	 * */
	public String[] cadastraAluno() {
		for (c = 0; c <= qtdAluno - 1; c++) {
			nome[c] = JOptionPane.showInputDialog("Digite o nome do aluno. ");
			matricula += c;
			System.out.println("matricula " + matricula + " nome " + nome[c]);
		}
//		System.out.println("matricula " + matricula + "nome " + nome[c]);
		materia[c] += ("MATERIAS:" + materia[c]);
		return nome;
	}

	/**
	 * Responsável por buscar as matérias já cadastradas
	 * @name materia()
	 * @acess public
	 * @type String[]
	 * @return materia
	 * 
	 */
	public String[] materia() {
		for (m = 0; m < materia.length; m++) {
			System.out.println("MATERIAS: " + materia[m]);
		}
		return materia;
	}
	/**
	 * principal função gerar relatorio com os sequintes dados: </br>
     	 *nome, matricula, materias com as médias.
 	 * @name relatorio()
	 * @access public
	 * @type String
	 * @return null
	 * 
	 * */  
	public String relatorio() {
		for (c = 1; c <= 2; c++) {
			for (m = 1; m <= 4; m++) {
				JOptionPane.showMessageDialog(null, "nome aluno\n" + nome[c]
						+ "matricula\n" + matricula + "media\n" + media[i]
						+ "\nmaterias:\n" + materia[m]);
			}
		}
		return null;
	}
	  /**
	 * principal função captura a opção de saida do programa</br>
     	 * digitada pelo usuário e fecha o programa </br> 
 	 * @name sair()
	 * @access public
	 * @type String
	 * @return ""
	 * 
	 * */  
	public String sair() {
		JOptionPane.showMessageDialog(null, "Fim do programa");
		System.exit(0);
		return "";
	}
	  /**
	 * Responsavel por buscar os dados e calcular as notas e </br>
	 	* médias digitados pelo usuário</br> 
	 * @name frequencia()
	 * @access public
	 * @param boolean
	 * 
	 * */
	public boolean frequencia() {
		System.out.println("inicio frequencia.");
		for (c = 0; c <= qtdAluno; c++) {
			diaAula[i] = Float.parseFloat(JOptionPane
					.showInputDialog("digite o total de aulas do aluno ? "));
			falta[i] = Float.parseFloat(JOptionPane
					.showInputDialog("digite o total de faltas do aluno ? "));

			frequencia[i] = (float) (diaAula[i] * 0.75);
			diaFalta[i] = diaAula[i] - falta[i];
			System.out.println("frequencia" + frequencia);
			System.out.println("diaFalta" + diaFalta[i]);
		}
		if (diaFalta[i] <= frequencia[i]) {
			System.out.println("Aluno reprovado.");
			return false;
		} else {
			System.out.println("Aluno aprovado.");
			return true;
		}
	}

	 /**
	 * Responsavel em dar mensagem se aprovado ou reprovado</br>
	 	* de acordo com a média do aluno</br> 
	 * @name aprovacao()
	 * @access public
	 * @param boolean
	 * 
	 * */
	public boolean aprovacao() {
		for (i = 0; i < 2; i++) {
			if ((media[i][c] == 6) && (frequencia() == false)) {
				System.out.println("Reprovado por faltas");
				return false;
			} else if ((media[i][c] < 6) && (frequencia() == true)) {
				System.out.println("aprovado");
				return true;
			} else if (frequencia() == true) {
				System.out.println("reprovado por nota");
				return false;
			} else {
				System.out.println("Reprovado por faltas e notas.");
				return true;
			}
		}
		return false;
	}
}

Com o Erro

[color=red]
java.lang.ArrayIndexOutOfBoundsException: 4
at avaliacao.Avaliacao.mediaAluno(Avaliacao.java:34)
at menu.Menu.MenuPrograma(Menu.java:25)
at aluno.Programa.main(Programa.java:17)
[/color]

3 Respostas

gilmaslima

Esse erro é porque vc está tentando acessar um índice inválido de array.

Dá uma olhada nessa linha:

if ((media[i][c] == 6) && (frequencia() == false)) {

veja se o valor da variavel c está correto

mduques

Altera esse cara:

.
.
.

//coloque o < e nao o <=
     for (c = 0; c<Aluno.qtdAluno; c++) {  
                 for (m =0; m<Aluno.materia.length; m++) {

.
.
.
para percorrer um array

for (int x = 0; x < SEU_ARRAY.length; x++) {System.out.println(SEU_ARRAY[x]);}

Altere esse cara tbem

public int qtdAluno() {  
         qtdAluno = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de alunos para cadastro"));  
         c = qtdAluno;  
         System.out.println("Quantidade " + c);  
         if (qtdAluno == 0) {  
             JOptionPane.showMessageDialog(null, "Quantidade inválida");  
             qtdAluno();  
         } else {  
nome = new String[qtdAluno] ;
         }  
         return c;  
     }
V

mduques:
Altera esse cara:

.
.
.

//coloque o < e nao o <=
     for (c = 0; c<Aluno.qtdAluno; c++) {  
                 for (m =0; m<Aluno.materia.length; m++) {

.
.
.
para percorrer um array

for (int x = 0; x < SEU_ARRAY.length; x++) {System.out.println(SEU_ARRAY[x]);}

Altere esse cara tbem

public int qtdAluno() { qtdAluno = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de alunos para cadastro")); c = qtdAluno; System.out.println("Quantidade " + c); if (qtdAluno == 0) { JOptionPane.showMessageDialog(null, "Quantidade inválida"); qtdAluno(); } else { nome = new String[qtdAluno] ; } return c; }

Ele ainda continua somando as notas das matérias…

Criado 26 de novembro de 2008
Ultima resposta 26 de nov. de 2008
Respostas 3
Participantes 3