Pergunta

Em Java regular, você pode obter o texto de um rastreamento de pilha, passando um PrintWriter para printStackTrace. Tenho a sensação de que sei a resposta a esta (ou seja, "Não"), mas,

Existe alguma maneira de obter o texto de um rastreamento de pilha em JavaME como uma String?

Update:

Eu devo mencionar que eu estou restrito a CLDC 1.0

Foi útil?

Solução

AFAIK não há nenhuma maneira de obter o rastreamento de pilha como um valor da cadeia, a menos que uma plataforma específica fornece um meio para substituir o fluxo System.err padrão. Na plataforma BlackBerry, ele lança fora o rastreamento de pilha em catch(Exception), a fim de economizar memória, no entanto, não fazer isso em catch(Throwable) e dá acesso ao rastreamento de pilha para o log do evento do dispositivo.

O que eu acabei fazendo é pegar Throwable em vez de Exceção no último momento possível e imprimir o rastreamento de pilha de lá. Isto, obviamente, tem o perigo de que você também está pegando java.lang.Error que não é muito bom, especialmente se o seu OutOfMemoryError, embora uma chamada para System.gc() antes de imprimir o rastreamento de pilha parece reduzir o risco e nós não tivemos nenhum problema com ele .

Eu olhava para qualquer plataforma que você está alvejando e ver se eles dão acesso a System.err em algum lugar. Você sempre pode ligar um depurador e ele deve aparecer na saída do console, embora parece que você está depois de obter rastreamentos de pilha 'no campo'.

Outras dicas

duas soluções:

  • reproduzir a exceção no emulador. o kit de ferramentas sem fio e Netbeans irá imprimir rastreamentos de pilha em seu computador.

  • usar um dispositivo Symbian.

Antes do Feature Pack 2 da série 60 3ª edição, aparelhos Symbian usar máquina virtual do Sun Hotspot java. Foi adaptado para Symbian ligando-o a uma aplicação parcial de biblioteca padrão C.

Isto permitiu Symbian para criar um programa em C ++ chamado redirecionador, que era capaz de capturar a saída padrão VM e erro padrão, incluindo rastreios de pilha de exceção Java.

o redirecionador c ++ não foi atualizado para a versão 9 do Symbian OS. Em vez disso, um "redirecionamento: //" protocolo GCF foi introduzida no VM,

A partir de um MIDlet separado, abra um InputStream de conexão retornado por Connector.open ( "redirecionamento: //", Connector.READ); Você pode então rastreamentos de pilha de exceção captura em telefones Symbian.

EDIT: "redirecionamento: //" está de volta em Series60 5ª edição e "redirecionamento: // test" deve funcionar em Series60 3ª recurso edição pack 2

Eu não coisa há uma maneira de fazer isso em CLDC 1.0. No entanto, em alguns dispositivos / sistemas operacionais a classe exceção subjacente poderia ser fornecendo uma maneira para acessar o rastreamento de pilha (pense mais recentes versões CLDC). Apenas inspecionar o exemplo de exceção em tempo de execução usando a reflexão para ver o que os membros expõe em suas plataformas de destino. Você poderia, então, escrever algum código que será capaz de extrair com segurança o rastreamento de pilha nas plataformas que oferecem tais informações.

Eu criei uma ferramenta que pode ser usado para registrar os rastreamentos de pilha adequadas também em CLDC. Confira em http://jarrut.sourceforge.net . Ainda é muito novo e que pode ter algumas arestas, mas funciona para mim e eu não podia imaginar MIDlets em desenvolvimento, sem mais. A melhor maneira de usá-lo é combiná-lo com Microlog.

Unfotunately a ferramenta exige actualmente CLDC 1.1 por isso não pode resolver o problema para o poster original.

Você pode ter a gravação PrintWriter a um ByteArrayOutputStream e reconstruir a seqüência dos bytes.

try{
    throw new Exception("Message");     
} catch (Exception ex){
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ex.printStackTrace(new PrintStream(out));
    System.out.println(new String(out.toByteArray()));
}

Não é bonito, mas deve funcionar praticamente em todos os lugares. Antes de tentar a acima, certifique-se que você não tem acesso a [Throwable # getStackTrace] ( http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace ()) , Eclipse afirma que é disponível no CDC / Foundation 1.1, mas isso não diz nada sobre outros perfis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top