Alguém pode me ajudar com Casting!

22 respostas
marlos86

Galera, estou fazendo um projeto em java para a minha monografia e bateu um duvida que n consigo resolver.
Estou utilizando uma JTable na minha classe desktop. Ja criei um DefaultModel(linha, coluna). O método getValueAt(int, int) retorna um objeto porém preciso que esse objeto seja um double pois minha monografia trabalha com matrizes (matemática). Aí está meu código que não funciona!!

tab = new DefaultTableModel(alinha, acoluna);
jTable.setModel(tab);
			
private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(tab);
			jTable.setBounds(new Rectangle(6, 30, 263, 241));
		    
			a = new Matriz(alinha, acoluna);
					
			for(int i=0; i<=alinha-1; i++){
		    	for(int j=0; j<=acoluna-1; j++){
	
                               			a.matriz[l][m] = Double.parseDouble((String) jTable1.getValueAt(l, m));
		    				    		    	
		    	}
		    }
			
		  }
		return jTable;
	}

Matriz é um vetor bidimensional de doubles.

22 Respostas

fiaux

Não entendi. Qual o problema? Algum erro?

marlos86

Essa linha é que tá com problema:

a.matriz[i][j] = Double.parseDouble((String) jTable.getValueAt(i, j));

Eu coloco para imprimir os valores de a e nada, surge um erro.

Não ta fazendo o Casting pois jTable.getValueAt(i,j) imprime direitinho.

Desde ja agradeço-t

W
for(int i=0; i<=alinha-1; i++){
   for(int j=0; j<=acoluna-1; j++){
       a.matriz[l][m] = Double.parseDouble((String) jTable1.getValueAt(l, m)); 
   }
}

Da onde vc tirou esse “I” e “m” que vc esta usando como indices da matriz ? Nao seria i e j ?

//Daniel

marlos86

a ta me desculpa é que esse i e m são de outro método que eu copiei… mass essa parte ta certinha sim … o problema é mesmo com o Casting…

marlos86

É pq eu tenho duas jTables e uma usa o método getJTable e a outra getJTable1, foi mal

fiaux

O que getValueAt retorna? Que tipo? Mostre o código dele.

W

hummm, se vc manda imprimir no terminal o resultado do getValueAt imprime o valor corretamente?
Tenta usar o Double.valueOf( (String)… pra ver o que acontece.

//Daniel

marlos86
private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(tab);
			jTable.setBounds(new Rectangle(6, 30, 263, 241));
		    
			a = new Matriz(alinha, acoluna);
	
			for(int i=0; i<=alinha-1; i++){
		    	for(int j=0; j<=acoluna-1; j++){
		    	 
		    		a.matriz[i][j] = Double.parseDouble((String) jTable.getValueAt(i, j));
		                         
		    	}
		    }
			
		  }
		return jTable;
	}

	/**
	 * This method initializes jTable1	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable1() {
		if (jTable1 == null) {
			jTable1 = new JTable(tab1);
			jTable1.setBounds(new Rectangle(272, 30, 273, 242));
			

			b = new Matriz(blinha, bcoluna);
			
			for(int l=0; l<=blinha-1; l++){
		    	for(int m=0; m<=bcoluna-1; m++){
		    	b.matriz[l][m] = Double.parseDouble((String) jTable1.getValueAt(l, m));
		    	}
		    }
			
		}
		return jTable1;
	}


	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(tab);
			jTable.setBounds(new Rectangle(6, 30, 263, 241));
		    
			a = new Matriz(alinha, acoluna);
	
			for(int i=0; i<=alinha-1; i++){
		    	for(int j=0; j<=acoluna-1; j++){
		    	 
		    		a.matriz[i][j] = Double.parseDouble((String) jTable.getValueAt(i, j));
		                         
		    	}
		    }
			
		  }
		return jTable;
	}

	/**
	 * This method initializes jTable1	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable1() {
		if (jTable1 == null) {
			jTable1 = new JTable(tab1);
			jTable1.setBounds(new Rectangle(272, 30, 273, 242));
			

			b = new Matriz(blinha, bcoluna);
			
			for(int l=0; l<=blinha-1; l++){
		    	for(int m=0; m<=bcoluna-1; m++){
		    	b.matriz[l][m] = Double.parseDouble((String) jTable1.getValueAt(l, m));
		    	}
		    }
			
		}
		return jTable1;
	}


	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(tab);
			jTable.setBounds(new Rectangle(6, 30, 263, 241));
		    
			a = new Matriz(alinha, acoluna);
	
			for(int i=0; i<=alinha-1; i++){
		    	for(int j=0; j<=acoluna-1; j++){
		    	 
		    		a.matriz[i][j] = Double.parseDouble((String) jTable.getValueAt(i, j));
		                         
		    	}
		    }
			
		  }
		return jTable;
	}

	/**
	 * This method initializes jTable1	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable1() {
		if (jTable1 == null) {
			jTable1 = new JTable(tab1);
			jTable1.setBounds(new Rectangle(272, 30, 273, 242));
			

			b = new Matriz(blinha, bcoluna);
			
			for(int l=0; l<=blinha-1; l++){
		    	for(int m=0; m<=bcoluna-1; m++){
		    	b.matriz[l][m] = Double.parseDouble((String) jTable1.getValueAt(l, m));
		    	}
		    }
			
		}
		return jTable1;
	}

	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(tab);
			jTable.setBounds(new Rectangle(6, 30, 263, 241));
		    
			a = new Matriz(alinha, acoluna);
	
			for(int i=0; i<=alinha-1; i++){
		    	for(int j=0; j<=acoluna-1; j++){
		    	 
		    		a.matriz[i][j] = Double.parseDouble((String) jTable.getValueAt(i, j));
		                         
		    	}
		    }
			
		  }
		return jTable;
	}

	/**
	 * This method initializes jTable1	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable1() {
		if (jTable1 == null) {
			jTable1 = new JTable(tab1);
			jTable1.setBounds(new Rectangle(272, 30, 273, 242));
			

			b = new Matriz(blinha, bcoluna);
			
			for(int l=0; l<=blinha-1; l++){
		    	for(int m=0; m<=bcoluna-1; m++){
		    	b.matriz[l][m] = Double.parseDouble((String) jTable1.getValueAt(l, m));
		    	}
		    }
			
		}
		return jTable1;
	}


	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(tab);
			jTable.setBounds(new Rectangle(6, 30, 263, 241));
		    
			a = new Matriz(alinha, acoluna);
	
			for(int i=0; i<=alinha-1; i++){
		    	for(int j=0; j<=acoluna-1; j++){
		    	 
		    		a.matriz[i][j] = Double.parseDouble((String) jTable.getValueAt(i, j));
		                         
		    	}
		    }
			
		  }
		return jTable;
	}

	/**
	 * This method initializes jTable1	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable1() {
		if (jTable1 == null) {
			jTable1 = new JTable(tab1);
			jTable1.setBounds(new Rectangle(272, 30, 273, 242));
			

			b = new Matriz(blinha, bcoluna);
			
			for(int l=0; l<=blinha-1; l++){
		    	for(int m=0; m<=bcoluna-1; m++){
		    	b.matriz[l][m] = Double.parseDouble((String) jTable1.getValueAt(l, m));
		    	}
		    }
			
		}
		return jTable1;
	}
getValueAt public Object getValueAt(int row, int column) Returns the cell value at row and column. Note: The column is specified in the table view's display order, and not in the TableModel's column order. This is an important distinction because as the user rearranges the columns in the table, the column at a given index in the view will change. Meanwhile the user's actions never affect the model's column ordering.

Parameters:
row - the row whose value is to be queried
column - the column whose value is to be queried
Returns:
the Object at the specified cell

J

Assim vai compilar.

double valor = Double.parseDouble( String.valueOf(jTable1.getValueAt(0,0)));

Esse tipo de casting semelhante ao da linguagem c não funciona corretamente em java. Use os recursos da classe String.

marlos86

POxa ele ta compilando mas não imprime os valores

fiaux

Eu ainda não consegui entender o problema, sua dificuldade.

ViniGodoy

Não use DefaultTableModel

marlos86

Eu to querendo fazer um Casting de um tipo Object para um tipo primitivo double.

Quando eu mando imprimir apenas o Object ( jTable.getValueAt(i, j)) ta imprimindo, mas quando eu tento fazer um Cast desse Object para um double ta dando erro, n ta imprimindo. E eu preciso desse Cast pois meu programa faz operações com matrizes, ou seja, trabalha com números reais.

marlos86

Se eu n usar o DefaultTableModel eu n consigo criar uma jTable dinamicamente, onde o usuário dimensiona sua própria matriz.

ViniGodoy

No lugar, crie um filho de AbstractTableModel. Não só seu código vai ficar mais simples, limpo e organizado, como também evitará redundância de dados, o que reduz o consumo de memória e processamento. Como se isso tudo não bastasse, também vai evitar que você faça casts.

Dá uma olhada nesse exemplo:
http://www.guj.com.br/posts/list/98452.java#530523

Outra coisa. Sempre que for postar código, use a tag code. Isso deixa o código formato. Caso contrário é muito difícil a leitura. Se você ainda não sabe fazer isso, leia o tópico:
http://www.guj.com.br/posts/list/50115.java

J

Debuga a linha e vê se não tá retornando nulo amigo. Como Object é um ponteiro pode estar causando violação de memória(Pode crer, já vi violações de memória em java ).

ViniGodoy

Mesmo? Eu nunca vi, e trabalho com a linguagem ha vários anos.

A área nula é uma área válida, pode ser usada para testes como if (obj == null), por exemplo. O que você não pode é tentar acessar os métodos de um objeto nulo… pois o objeto não está lá. Mas isso não é violação de memória. O erro gerado é da linguagem, bonitinho, com stack trace e tudo mais.

Agora, não existem ponteiros em Java. Você não pode alterar o valor de endereços através de aritmética e nem pode deletar um objeto diretamente, desreservando sua área de memória enquanto outras referências apontam para ele. Por isso, não existe violação em Java.

J

Mesmo? Eu nunca vi, e trabalho com a linguagem ha vários anos.

A área nula é uma área válida, pode ser usada para testes como if (obj == null), por exemplo. O que você não pode é tentar acessar os métodos de um objeto nulo… pois o objeto não está lá. Mas isso não é violação de memória. O erro gerado é da linguagem, bonitinho, com stack trace e tudo mais.

Agora, não existem ponteiros em Java. Você não pode alterar o valor de endereços através de aritmética e nem pode deletar um objeto diretamente, desreservando sua área de memória enquanto outras referências apontam para ele. Por isso, não existe violação em Java.

Bem, então acho que você deveria rever seus conceitos. Eu também trabalho com java a bastante tempo, e te digo uma coisa, não é raro esse tipo de coisa acontecer. No próprio netbeans 6.5 já peguei um desses.

Agora, sobre o problema postado, um casting feito dessa maneira pode corromper dados da memória, mesmo sendo em java. Eu refiz o código do post, e aqui não deu erro, e consegui recuperar o valor sem problemas. Mas no caso dele, pode ser que seja um endereço com problemas, por isso precisa debugar a linha que dá o pau e olhar dentro da variável.

ViniGodoy

Consegue sim, e com facilidade… primeiro estude o jeito certo de fazer, usando um filho de AbstractTableModel. Só depois comece a achar que certas coisas são impossíveis.

ViniGodoy

Ok, espero um único exemplo sequer de uma operação que tenha corrompido memória. Claro, sem usar JNI.

Casting pode gerar perda de informação, ou alterar a forma com que um dado é interpretado de maneira inesperada. Mas isso também não tem nada a ver com violação de memória.

J

Ok, espero um único exemplo sequer de uma operação que tenha corrompido memória. Claro, sem usar JNI.

Casting pode gerar perda de informação, ou alterar a forma com que um dado é interpretado de maneira inesperada. Mas isso também não tem nada a ver com violação de memória.

A violação pode vir da própria vm, não somente de outros códigos nativos. No google existem vários casos. Tô dizendo isso prq já aconteceu comigo umas três vezes(uma vez no debugger), e , o dono do post estar com esse problema, mas não recebe um estouro prq executa sob a vm.

T

De modo geral, violações de memória podem ocorrer:

  • Devido a bugs no JIT (é só ver que a cada 10 bugs no JIT* no Bug Database pelo menos 1 se manifesta como algo que deixa um vestígio no hs_err_pidNNNN.log);
  • Devido a chamadas a código nativo (JNI);

Um programa Hello, World não deve causar nenhuma violação de memória.

  • Felizmente esses bugs são bastante infreqüentes.
Criado 27 de janeiro de 2009
Ultima resposta 27 de jan. de 2009
Respostas 22
Participantes 6