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!!
[RESOLVIDO] Tratamento de exceção
8 Respostas
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…
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;
}
}
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
(poderia ser mais se não fosse o Big GUJ Crash
)
Não funcionou…

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
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
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!!!