Olá pessoal, boa noite.
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?
Obrigado a todos.
Fabricio Soares
Oi
umcertoalguem… que legal esse nick cara…
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+
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ção
public void StartNodoExtencao(Nodo Start, Nodo End)
{
// O No atual recebe o inicio da árvore
Nodo No = new Nodo();
Nodo Children = new Nodo();
Fifo FifoStart = new Fifo();
Fifo FifoEnd = new Fifo();
Fifo FifoNo = new Fifo();
// O No no atribulo Father é ligado ao null
No = Start;
No.Father = null;
// O atribulo Blank recebe o campo em que o Puzzle está branco
int Blank, Motion, i, j;
int[] Positions;
String[] Puzzle;
// Rotina de criação dos nós filhos
while(PartOut(No, End) != 0)
{
// O método TestBlank retorna a possição em branco do Puzzle
Blank = 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íveis
Positions = new int[Motion];
// O método PositionsNodo retorna para o vetor Positions as posições que serão movimentadas
Positions = PositionsNodo(No, Positions, Blank);
// Cria o número do filhos que o Nodo No irá apontar
No.Son = new Nodo[Motion];
// Cria uma nova string de caracteres
Puzzle = new String[9];
// Rotina ligação dos nós filhos para o nó pai
for(i = 0; i < Positions.length; i++)
{
// Monta uma string igual a string do Nodo No
for(j = 0; j < 9; j++)
Puzzle[j] = No.Puzzle[j];
// Faz a troca de dados referente as posições do Positions e do Blank
Puzzle[Blank] = Puzzle[Positions[i]];
Puzzle[Positions[i]] = "";
// Cria um novo Nodo chamado Children e joga a string atual
Children = new Nodo(Puzzle);
FifoNo = new Fifo(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 Children
No.Son[i] = Children;
// O Nodo Children no atributo Father é ligado ao Nodo No
Children.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]
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:
Nossa mãe, o Java consome tanta memória assim?
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?
Obrigado.
Fabricio Soares