[RESOLVIDO] Tratamento de exceção

Gente eu gostaria de saber como é q eu trato a exceção de falta de memoria… queria q quando o arquivo q eu estivesse lendo ultrapassasse a memoria virtual, aparecesse um joptionpane.showMessageDialog com a mensagem memoria insuficiente… como devo fazer?
Obrigada!!

Você deve estar falando da OutOfMemoryError. Na verdade, ela não é uma exceção, mas um erro, e é irrecuperável. O Que você pode tentar fazer é realizar a leitura do arquivo dentro de um try e capturar este erro com um catch, onde você exibiria a mensagem para o usuário. Seria alguma coisa assim (estou escrevendo de cabeça, sem um editor):

try {
     // lendo um arquivo aqui...
}
catch (OutOfMemoryError error) {
     JOptionPane(this, "O arquivo é muito grande!", "Erro");
     System.exit(1);
}

Mas não sei se vai funcionar, porque quando um erro deste tipo ocorre, acho que a jvm “morre” automaticamente…

Oi, deu certo, ficz como vc disse:

[code]
public byte[] readMap(RandomAccessFile fis,int width, int height) throws IOException{
try {
byte mapArea[] = new byte[width*height];
fis.read(mapArea);
return mapArea;
}
catch (OutOfMemoryError error) {
JOptionPane.showMessageDialog(null, “O arquivo é muito grande, falta memoria na sua virtual machine!”);
System.exit(0);
return null;
}

  }
 [/code]

Porém, no console aparece o seguinte:

java.lang.OutOfMemoryError
CONSTRUÍDO COM SUCESSO (tempo total: 33 segundos)

Não tem um jeito de desaparecer esse java.lang.OutOfMemoryError?

Isso acontece porque, por padrão, todo erro é ecoado para System.err que, normalmente, aponta que o mesmo PrintStream que o System.out. O que você pode tentar fazer (mas eu não recomendo), é configurar o System.err para null. Adicione a seguinte linha ao seu programa, antes de tentar ler o arquivo:

System.setErr(null);

PS: Editado para comemorar a marca de 500 mensagens :smiley: (poderia ser mais se não fosse o Big GUJ Crash :cry: )

Não funcionou…
:frowning:

Uma segunda duvida, eu inicio o meu programa com o xmx de 4gb… caso o usuario não tenha esses 4 gb disponiveis, tem como lançar um exceção???

Obrigada

Bom dia a todos:

Que tal você usar assim:

    try {
        long fmemory = Runtime.getRuntime().freeMemory();
        if (fmemory <  47416) throw new Exception();
    }  catch (Exception ex) {
        String mens = "Esta aplicação é muito grande \n";
        mens += "para ser executada em pouca memória.\n";
        mens += "Fechando a aplicação.";   
        JOptionPane.showMessageDialog(this, mens, "Erro");  
        System.exit(0);  
   }  

O método freeMemory da classe Runtime retorna o valor em bytes da memória livre, assim sendo voce pode estabelecer um patamar um pouco acima antes dele atingir o seu limite máximo para não encerrar a VM, e disparar a exceção, eu estabeleci o valor mínimo de 47 bytes, porém não tenho certeza se com esse valor baixo a VM ainda funcione.

Olá, mas onde eu devo colocar isso?
Pq, eu criei um arquivo exe q inicializa o meu jar com o xmx com 4000. ou seja o jar é iniciado pelo exe. Onde eu poderia colocar essa parte do codigo? no main?
Obrigado

[quote=oitathi]Olá, mas onde eu devo colocar isso?
Pq, eu criei um arquivo exe q inicializa o meu jar com o xmx com 4000. ou seja o jar é iniciado pelo exe. Onde eu poderia colocar essa parte do codigo? no main?
Obrigado[/quote]

Pelo certo, voce deve colocar na classe Main, dentro do código java, ou dentro de qualquer outra classe que inicializa a aplicação com o método public static void main(String args[]), e invocar esse código tão logo a aplicação seja inicializada, assim:

package testememoriavm;

import javax.swing.JOptionPane;


public class TesteMemoriaVM {

    public static void main(String args[]) {
       try {
           long fmemory = Runtime.getRuntime().freeMemory();  
           if (fmemory < 47416) throw new Exception();
       } catch (Exception ex){
           String mens = "Esta aplicação é muito grande \n";  
           mens += "para ser executada em pouca memória.\n";  
           mens += "Fechando a aplicação.";
           JOptionPane.showMessageDialog(null, mens);
           exitProgram();
       }        
    }
    
    public static void exitProgram(){
        System.exit(0);
    }

}

Obrigado!!!
Irei colocar!!!