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