Eu estava usando o seguinte código numa listagem de registros:
Enumeration clientsE = clients.elements();
Object element = null;
Client client = null;
while (clientsE.hasMoreElements())
{
if ((element = clientsE.nextElement()) != null)
{
client = (Client) element;
String razaoSocial = client.getRazaoSocial();
razaoSocial = razaoSocial.substring(0, 20 - (20 - razaoSocial.length()));
String nomeFantasia = client.getNomeFantasia();
nomeFantasia = nomeFantasia.substring(0, 20 - (20 - nomeFantasia.length()));
String label = client.getID() + "-" + razaoSocial + "-" + nomeFantasia;
choice.append(label, null);
}
}
E sempre quando o MIDP executava esta linha:
String label = c.getID() + "-" + razaoSocial + "-" + nomeFantasia;
O emulador fechava e no prompt era mostrada essa mensagem:
Descobri que era esta linha específica quem estava causando o erro pois fui descomentando linha por linha para ver aonde exatamente a aplicação “travava/fechava”.
Então resolvi usar uma StringBuffer, ficando assim meu código:
Enumeration clientsE = clients.elements();
Object element = null;
Client client = null;
StringBuffer label = null;
while (clientsE.hasMoreElements())
{
if ((element = clientsE.nextElement()) != null)
{
client = (Client) element;
label = new StringBuffer(20);
String razaoSocial = client.getRazaoSocial();
String nomeFantasia = client.getNomeFantasia();
label.append(client.getID());
label.append("-");
label.append(razaoSocial.substring(0, 20 - (20 - razaoSocial.length())));
label.append("-");
label.append(nomeFantasia.substring(0, 20 - (20 - nomeFantasia.length())));
choice.append(label.toString(), null);
}
}
Agora está funcionando corretamente.
Alguém tem idéia do que estaria causando o erro exatamente? O MIDP realmente faz uma medição de memória para verificar se a aplicação vai rodar no dispositivo? Pois a única explicação que encontrei foi que o MIDP tem memória máxima já configurada, e a criação de muitas String’s estaria causando esse erro (embora o loop que vocês viram acima esteja tendo apenas 2 iterações).