Estou desenvolvendo um jogo (Puzzle - http://www.permadi.com/java/puzzle8) em java onde insiro o estado inicial e o estado final.
Monto a estrutura de árvore e o método de busca na árvore a Busca Por Extensão.
Quando o estado inicial e o estado final e muito diferente e executo o programa ele retorna o seguinte erro: java.lang.OutOfMemoryError.
Como posso descobrir em qual linha ele dá esse erro e como solucioná-lo?
Olha, teu código tem algum loop que crie instancias de alguma classe qualquer??? Se tiver, de uma conferida nele… Mas, em todo caso, tu pode postar teu código aqui, se puder né.
T+
U
umcertoalguemPJ
Olá jeveaux, boa noite.
Segue o meu código abaixo.
Ele cria uma árvore e uma lista.
Estou com dificudades de trabalhar com Listas em Java, eu trabalho muito bem com elas no C e C++;
// Inicialização da rotina de Busca Por ExtençãopublicvoidStartNodoExtencao(NodoStart,NodoEnd){// O No atual recebe o inicio da árvoreNodoNo=newNodo();NodoChildren=newNodo();FifoFifoStart=newFifo();FifoFifoEnd=newFifo();FifoFifoNo=newFifo();// O No no atribulo Father é ligado ao nullNo=Start;No.Father=null;// O atribulo Blank recebe o campo em que o Puzzle está brancointBlank,Motion,i,j;int[]Positions;String[]Puzzle;// Rotina de criação dos nós filhoswhile(PartOut(No,End)!=0){// O método TestBlank retorna a possição em branco do PuzzleBlank=TestBlank(No);// O método StartNodoFathe cria todos os filhos do No atual// StartNodoFather(No, Blank, FifoStart, FifoEnd);Motion=MotionNodoFather(Blank,No);// Cria um vetor que irá guardar as posições dos movimentos possíveisPositions=newint[Motion];// O método PositionsNodo retorna para o vetor Positions as posições que serão movimentadasPositions=PositionsNodo(No,Positions,Blank);// Cria o número do filhos que o Nodo No irá apontarNo.Son=newNodo[Motion];// Cria uma nova string de caracteresPuzzle=newString[9];// Rotina ligação dos nós filhos para o nó paifor(i=0;i<Positions.length;i++){// Monta uma string igual a string do Nodo Nofor(j=0;j<9;j++)Puzzle[j]=No.Puzzle[j];// Faz a troca de dados referente as posições do Positions e do BlankPuzzle[Blank]=Puzzle[Positions[i]];Puzzle[Positions[i]]="";// Cria um novo Nodo chamado Children e joga a string atualChildren=newNodo(Puzzle);FifoNo=newFifo(Children);// FifoNo.InsertFifo(Children, FifoNo, FifoStart, FifoEnd);if(FifoStart.No==null){FifoStart=FifoEnd=FifoNo;FifoStart.FifoBack=null;FifoStart.FifoNext=null;FifoStart.No=Children;}else{FifoEnd.FifoNext=FifoNo;FifoNo.FifoBack=FifoEnd;FifoNo.FifoNext=null;FifoNo.No=Children;FifoEnd=FifoEnd.FifoNext;}// O Nodo No no atributo Son é ligado ao atual Nodo ChildrenNo.Son[i]=Children;// O Nodo Children no atributo Father é ligado ao Nodo NoChildren.Father=No;}if(No!=Start){if(FifoStart!=FifoEnd){FifoStart=FifoStart.FifoNext;FifoStart.FifoBack=null;}}No=FifoStart.No;}JOptionPane.showMessageDialog(null,"Encontrou");}
[color="green"][size="11"]* Lembre-se da tag [code]![/size][/color]
M
matheusPJ
bem, como a exceção é OutOfMemoryError, como disse o jeve, o problema deve estar em algum laço, q esta instanciando muitos objetos na memória, nao rodei teu código, porém achei essas instruções detro de 2 laços aninhados:
for(i = 0; i < Positions.length; i++)
{
for(j = 0; j < 9; j++)
{
...
Children = new Nodo(Puzzle);
FifoNo = new Fifo(Children);
...
…imagino q estes laços estão chamando criando muitos objetos Nodo e Fifo, e dependendo do tamanho da sua memória… ela pode terminar ligeirinho! :roll:
U
umcertoalguemPJ
Nossa mãe, o Java consome tanta memória assim?
U
umcertoalguemPJ
Bom tarde a todos.
Como esse erro é decorrente de falta de memória durante a execução do programa, terei que procurar as linhas onde está criando os objetos que compõem a árvore… ouvi falar sobre desalocação de memória, alguem poderia me repassar uma forma de fazer isso?