Duvida - utilizaÇÃo de vetores

6 respostas
T

Boa noite, estou com o seguinte problema:
Estou fazendo um programinha basico e primeiro estava tendo problema com excessao, aparecia este erro:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Presidiario.cadastro(Presidiario.java:32)
at Principal.main(Principal.java:12)

esse era o código:
import javax.swing.JOptionPane;
public class Presidiario extends Cadeia{

	
	
	
	private int x=5;       //<<<< AKI QUE EU TIVE QUE INICIALIZAR
    private String[] nome_det= new String[x];
	private String[] cela= new String[x];
	private String[] crime= new String[x];
	private String[] pena= new String[x];
	
	public Presidiario(String nome, String capacidade, String tipo, String diretor, String cidade, String estado )
	{
		super(nome,capacidade,tipo,diretor,cidade,estado);
	}
	
	public Presidiario()
	{
		
	}
	
	public void numero_det()
	{
		x=Integer.parseInt(JOptionPane.showInputDialog("Digite o numero de Detentos no Presidio"));
	}
	
	public void cadastro()
	{
		for (int i = 0;i<x;i++)
		{
			nome_det[i]=JOptionPane.showInputDialog("Digite o nome do presidiario");
			cela[i]=JOptionPane.showInputDialog("Digite a cela em que está o presidiario");
			crime[i]=JOptionPane.showInputDialog("Digite o crime cometido");
			pena[i]=JOptionPane.showInputDialog("Digite a pena do presidiario");			
		}
	}
	
	public void escolha()
	{
		int op;
		op=Integer.parseInt(JOptionPane.showInputDialog("Digite '1' para ver os nomes dos presidiarios \n'2' para ver os nomes e suas respectivas celas \n'3' para ver os nomes, celas e crime e pena \n'4' para ver os dados completo do presidiario e presidio"));
		
		
		switch(op)
		{
		case 1:
			for(int i=0;i<x;i++)
			{
				JOptionPane.showInputDialog(null,"Nome: "+nome_det[0]);
			}
			break;
		case 2: 
			for(int i=0;i<=x;i++)
			{
			JOptionPane.showInputDialog(null,"Nome: "+nome_det[i]+"\nCela: "+cela[i]);
			}
			break;
		case 3: 
			for(int i=0;i<=x;i++)
			{
			JOptionPane.showInputDialog(null,"Nome: "+nome_det[i]+"\nCela: "+cela[i]+"\nCrime: "+crime[i]+"\nPena: "+pena[i]);
			}
			break;
		case 4:
		
			Cadeia c=new Cadeia(" "," "," "," "," "," ");
			JOptionPane.showInputDialog(null,"*************DADOS DO PRESIDIO**************");
			JOptionPane.showInputDialog(null,"Nome do Presidio: "+c.getNome()+"\nCapacidade: "+c.getCapacidade()+"\nTipo: "+c.getTipo()+"\nDiretor: "+c.getDiretor()+"\nCidade: "+c.getCidade()+"/"+"Estado: "+c.getEstado());
					
			for(int i=0;i<=x;i++)
			{
			JOptionPane.showInputDialog(null,"Nome: "+nome_det[i]+"\nCela: "+cela[i]+"\nCrime: "+crime[i]+"\nPena: "+pena[i]);
			}
			break;
		
		default: JOptionPane.showInputDialog(null,"Entrada invalida!"); 
				Presidiario m = new Presidiario();
				m.escolha();
				break;
					
		}
			
	}
	
	public void voltarMenu()
	{
	Menu a=new Menu();
	
	a.escolha1();
	}
	
			
		
		
	}
mas ainda naum estava com x=5; ai quando eu coloquei x=5 ele parou com esse problema de excessao, mas, AKI É ONDE É MINHA DUVIDA AGORA, quando eu coloco pra mostrar o conteudo dos vetores, ele mostra como null, e não com o valor que lhe foi atribuido após o usuario ter entrado com o valor.

ao meu entender, e foi por isso que declarei o vetor como global, seria para qdo lesse o vetor eu pudesse usa-lo em outro método ja com os dados que foram inseridos depois.

como estou começando agora, queria saber se tem como fazer o vetor dinamico, tipo a pessoa entra com o valor de posições o vetor terá (em c# eu fazia isso e nunca tive esse problemas), e o porquê dele está dando null quando lê.

espero que tenham me entendido, obrigado desde já.

mais uma duvida, não tem a ver com o codigo acima, mas seria possivel uma classe herdar um vetor ou matriz? pq eu soh conseguia fazer herdar uma unica posicao do vetor entaum fica a duvida ai, se alguem souber responder.

AA E OUTRA COISA, antes que perguntei pq akele metodo construtor que não faz nada, é pq no case default caso fosse digitado errado ele chamaria o metodo escolha denovo. se alguem tiver dicas de como melhorar meu código ... :D

6 Respostas

BrunoBastosPJ

Se você chamar o cadastrar antes do escolher você não terá problemas.

Mas lembre-se você quando diz que um Array tem x elementos você não conseguirá mudar seu tamanho apenas mudando o valor de x, você tem que criar Arrays novos.

String[] array;
...
public void setSize(int size) {
   array = new String[size];
}

Neste caso todos os objetos de array[0] até array[size -1] terão o valor null, até que você os modifique chamando o método cadastrar.

Sua pergunta sobre herdar não fez nenhum sentido para mim :smiley:

Já a sobre o Default parece que você quer mandar o usuário digitar novamente o tamanho caso o valor seja inválido… Ai você pode fazer assim:

int size = 0;

do {
  //leia size
while(size > 0);
setSize(size);

A ordem que você deve executar os métodos é:

Leia o Size
Atribua o Size
Chame o Cadastrar
Chame o Escolha

T

o pior, eh que esta exatamente nessa ordem

eu leio o valor de x, leio o cadastrar, e depois vou mostrar quais os valores que foram inseridos pelo metodo cadastrar, mas ai aparece null.
entaum eu fiz o seguinte teste.
coloquei no metodo cadastrar, pra depois de cadastrar, mostrar. e funcionou

porem qdo chegava no case para mostrar aparecia null.

entaum fiz outro teste

dentro do que case que mostrava os valores do do vetor, eu coloquei pra ler denovo, e funcionou.
ou seja, eh como se o método cadastrar depois que executado tipo "limpasse" tudo e qdo fosse a hora de ler naum funcionava. vo por a ordem que estou chamando os metodos

public class Principal {

	
	public static void main (String args[])
	{
		Cadeia g = new Cadeia();
		g.lerVariaveis();
		
		Presidiario a = new Presidiario();
		a.numero_det();
		a.cadastro();
		
		Menu f = new Menu();
		f.escolha1();
	}
	
	
}
import javax.swing.JOptionPane;
public class Menu {

	public void escolha1()
	{
		int op;
		Presidiario a =new Presidiario();
		//Funcionario b = new Funcionario();
		op=Integer.parseInt(JOptionPane.showInputDialog("Digite \n'1' ver os dados dos presidiarios \n'2' para ver os dados do funcionario"));
	
		switch(op)
		{
		case 1:
			
				a.escolha();
			
			break;
		case 2: 
			
			//b.escolha();
			
			break;
	
					
		}
			
	
	
	}
}
BrunoBastosPJ

Toda vez que você cria uma nova instância os valores dos atributos são atribuídos…

Se você chamou o cadastrar em uma instância de presidiário e o escolher em uma instância de menu nunca vai funcionar…

Você atribuiu os valores a um presidiário não a um menu.

T
BrunoBastosPJ:
Se você chamar o cadastrar antes do escolher você não terá problemas.

Mas lembre-se você quando diz que um Array tem x elementos você não conseguirá mudar seu tamanho apenas mudando o valor de x, você tem que criar Arrays novos.

mas esse eh o problema, eu criei o vetor com um valor x (a ser inserido pelo usuario) ai dava akele erro que postei no começo
Sua pergunta sobre herdar não fez nenhum sentido para mim :D
exemplo: classe 1
public class vetor()
{
String vetor[]=new String[5];

public void lerVetor()
{
for (int i=0;i<5;i++)
{
vetor[i]=i+1;
}
}
classe2
public class herança extends vetor
{
String vetor[]=new String[5];

public herança(MINHA DUVIDA É AKI, COMO EU FARIA PRA HERDAR O VETOR INTEIRO)
{
super(     ?      ) ;
}
 a sobre o Default parece que você quer mandar o usuário digitar novamente o tamanho caso o valor seja inválido... Ai você pode fazer assim:
int size = 0;

do {
  //leia size
while(size > 0);
[/quote]
setSize(size);
pode cre, tinah esquecido disso
A ordem que você deve executar os métodos é:

Leia o Size
Atribua o Size
Chame o Cadastrar
Chame o Escolha


executo, exatamente assim.

BrunoBastosPJ

Em herança a classe Filha tem tudo que está na classe Mãe, ela apenas não pode acessar diretamente alguns métodos e atributos desta classe às vezes.

Se você tem:

public class Vetor {
  public String[] array = new String[5];
}

public class Heranca extends Vetor {
   public void imprimirVetor() {
      //for
      System.out.println(array[i]);
   }
}
T
BrunoBastosPJ:
Toda vez que você cria uma nova instância os valores dos atributos são atribuídos...

Se você chamou o cadastrar em uma instância de presidiário e o escolher em uma instância de menu nunca vai funcionar...

Você atribuiu os valores a um presidiário não a um menu.

pow kra, funcionou em partes =x eu editei o codigo e ficou assim a parte que chama pra ler e mostrar:
import javax.swing.JOptionPane;
public class Menu {

	Presidiario a =new Presidiario();
	
	public void escolha1()
	{
		int op;
		
		//Funcionario b = new Funcionario();
		op=Integer.parseInt(JOptionPane.showInputDialog("Digite \n'1' ver os dados dos presidiarios \n'2' para ver os dados do funcionario"));
	
		switch(op)
		{
		case 1:
			
				
			a.escolha();
				
			
			break;
		case 2: 
			
			//b.escolha();
			
			break;
	
					
		}
	}
		
	public void lerCadastro()
		{
			a.cadastro();
		}
			
	
	
	
}
entretando, ele soh funciona uma vez, tipow a primeira vez que rodar funciona normal, mas no meu codigo eu coloquei pra depois que terminar voltar pro menu pra o usuario escolher se deseja fazer outra busca, enfim... ai ja volta a aparecer null :evil: eu deixei o codigo assim, mas ai soh roda uma vez mesmo. E os valores do presidio naum mostra, pode ser esse negocio da instancia mesmo, mas eu queria desse jeito mesmo, pq os dados do presidio seriam acessados tanto pela classe funcionarios como pela classe presidiarios e não se for pra eu instanciar pra ler e pra mostrar toda vez no mesmo lugar naum vale a pena.
import javax.swing.JOptionPane;
public class Presidiario extends Cadeia{
	
	
	private String[] nome_det= new String[3];
	private String[] cela= new String[3];
	private String[] crime= new String[3];
	private String[] pena= new String[3];
	
	public Presidiario(String nome, String capacidade, String tipo, String diretor, String cidade, String estado )
	{
		super(nome,capacidade,tipo,diretor,cidade,estado);
	}
		
	public Presidiario()
	{		
		//
	}
	
	//public void numero_det()
	//{
	//	x=Integer.parseInt(JOptionPane.showInputDialog("Digite o numero de Detentos no Presidio"));
	//}
	
	public void cadastro()
	{
		for (int i = 0;i<3;i++)
		{
			nome_det[i]=JOptionPane.showInputDialog("Digite o nome do presidiario");
			cela[i]=JOptionPane.showInputDialog("Digite a cela em que está o presidiario");
			crime[i]=JOptionPane.showInputDialog("Digite o crime cometido");
			pena[i]=JOptionPane.showInputDialog("Digite a pena do presidiario");			
		}
	}
	
	public void escolha()
	{
		int op;
		
		do
		{		
		
		op=Integer.parseInt(JOptionPane.showInputDialog("Digite '1' para ver os nomes dos presidiarios \n'2' para ver os nomes e suas respectivas celas \n'3' para ver os nomes, celas e crime e pena \n'4' para ver os dados completo do presidiario e presidio"));
		
		
		
		switch(op)
		{
		case 1:
			for(int i=0;i<3;i++)
			{
				JOptionPane.showMessageDialog(null,"Nome: "+nome_det[i]);
			}
			break;
		case 2: 
			for(int i=0;i<3;i++)
			{
				JOptionPane.showMessageDialog(null,"Nome: "+nome_det[i]+"\nCela: "+cela[i]);
			}
			break;
		case 3: 
			for(int i=0;i<3;i++)
			{
				JOptionPane.showMessageDialog(null,"Nome: "+nome_det[i]+"\nCela: "+cela[i]+"\nCrime: "+crime[i]+"\nPena: "+pena[i]);
			}
			break;
		case 4:
		
			Cadeia c=new Cadeia(" "," "," "," "," "," ");
			JOptionPane.showMessageDialog(null,"*************DADOS DO PRESIDIO**************");
			JOptionPane.showMessageDialog(null,"Nome do Presidio: "+c.getNome()+"\nCapacidade: "+c.getCapacidade()+"\nTipo: "+c.getTipo()+"\nDiretor: "+c.getDiretor()+"\nCidade: "+c.getCidade()+"/"+"Estado: "+c.getEstado());
					
			for(int i=0;i<3;i++)
			{
				JOptionPane.showMessageDialog(null,"Nome: "+nome_det[i]+"\nCela: "+cela[i]+"\nCrime: "+crime[i]+"\nPena: "+pena[i]);
			}
			break;
		
		default: JOptionPane.showMessageDialog(null,"Entrada invalida!"); 				
				break;
		}	
		} while(op>4);
				
		
		Menu a=new Menu();
		
		a.escolha1();
		
		}
			
	
	
	
	
			
		
		
	}

só uma duvida, um exemplo sem ser com vetor, eu coloquei pra ler dados do presidio no static void main, ou seja, eu criei uma instancia para atribuir valores, e depois eu criar uma instancia em outra classe para ler esses valores, os valores não serão mostrados?

_________________________________________________
agora a respeito do vetor dinamico;

é o seguinte se eu fizer assim:

private int x;
	private String[] nome_det= new String[x];
	private String[] cela= new String[x];
	private String[] crime= new String[x];
	private String[] pena= new String[x];

na hora de mostrar o resultado, ele o erro de excessao, e eu soh consigo fazer funcionar quando eu defino o valor de x, ou coloco o numero exato que eu quero. Teria algum jeito de eu fazer assim usando o x para receber o valor sem dar esse erro de excessao?

Criado 19 de maio de 2010
Ultima resposta 20 de mai. de 2010
Respostas 6
Participantes 2