Come ottenere il testo di una traccia dello stack di eccezioni in Java ME?

StackOverflow https://stackoverflow.com/questions/225489

  •  03-07-2019
  •  | 
  •  

Domanda

In Java normale, è possibile ottenere il testo di una traccia dello stack passando un PrintWriter a printStackTrace. Ho la sensazione di conoscere la risposta a questa (cioè "No") ma,

Esiste un modo per ottenere il testo di una traccia dello stack in JavaME come stringa?

Aggiornamento:

Vorrei menzionare che sono limitato a CLDC 1.0

È stato utile?

Soluzione

AFAIK non c'è modo di ottenere la traccia dello stack come valore di stringa, a meno che una piattaforma specifica non fornisca un mezzo per sovrascrivere il flusso System.err predefinito. Sulla piattaforma BlackBerry, elimina la traccia dello stack su catch (Exception) per risparmiare memoria, tuttavia non lo fa su catch (Throwable) e fornisce accesso alla traccia dello stack tramite il registro eventi del dispositivo.

Quello che ho finito è catturare Throwable piuttosto che Exception nell'ultimo momento possibile e stampare la traccia dello stack da lì. Questo ovviamente ha il pericolo che tu stia anche rilevando java.lang.Error che non è molto buono, specialmente se OutOfMemoryError , sebbene una chiamata a System.gc () prima di stampare la traccia dello stack sembra ridurre il rischio e non abbiamo avuto problemi con esso.

Guarderei qualunque piattaforma tu stia prendendo di mira e vedrei se danno accesso a System.err da qualche parte. Puoi sempre collegare un debugger e dovrebbe comparire nell'output della console, anche se sembra che tu stia cercando tracce dello stack "nel campo".

Altri suggerimenti

due soluzioni:

  • riproduce l'eccezione sull'emulatore. il toolkit wireless e Netbeans stamperanno le tracce dello stack sul tuo computer.

  • usa un dispositivo Symbian.

Prima del Feature Pack 2 della Serie 60 3a edizione, i telefoni Symbian utilizzano la macchina virtuale Java Sun Hotspot. È stato adattato al sistema operativo Symbian collegandolo a un'implementazione parziale della libreria standard C.

Ciò ha permesso a Symbian di creare un programma C ++ chiamato redirector, che era in grado di catturare l'output standard della VM e l'errore standard, incluse le tracce dello stack delle eccezioni java.

il redirector c ++ non è mai stato aggiornato per la versione 9 del sistema operativo Symbian. Invece, un "reindirizzamento: //" Il protocollo GCF è stato introdotto nella VM,

Da un MIDlet separato, aprire un InputStream dalla connessione restituita da Connector.open (" redirect: // " ;, Connector.READ); è quindi possibile acquisire tracce dello stack di eccezioni sui telefoni Symbian.

EDIT: " redirect: // " è tornato in Serie 60 5a edizione e "redirect: // test" dovrebbe funzionare sul Feature Pack 2 Series60 3rd edition 2

Non credo che ci sia un modo per farlo in CLDC 1.0. Tuttavia, su alcuni dispositivi / sistemi operativi la classe di eccezione sottostante potrebbe fornire un modo per accedere alla traccia dello stack (pensate alle versioni CLDC più recenti). Ispeziona l'istanza dell'eccezione in fase di runtime usando reflection per vedere quali membri espone sulle tue piattaforme di destinazione. È quindi possibile scrivere del codice che sarà in grado di estrarre in modo sicuro la traccia dello stack sulle piattaforme che offrono tali informazioni.

Ho creato uno strumento che può essere utilizzato per registrare le tracce dello stack corrette anche in CLDC. Dai un'occhiata a http://jarrut.sourceforge.net . È ancora molto nuovo e potrebbe avere alcuni spigoli, ma funziona per me e non potrei più immaginare di sviluppare MIDlet senza di essa. Il modo migliore per usarlo è combinarlo con microlog.

Purtroppo lo strumento attualmente richiede CLDC 1.1, quindi potrebbe non risolvere il problema per il poster originale.

Puoi fare in modo che PrintWriter scriva su un ByteArrayOutputStream e ricostruisca la stringa dai byte.

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

Non è carino, ma dovrebbe funzionare praticamente ovunque. Prima di provare quanto sopra, assicurati di non avere accesso a [Throwable # getStackTrace] ( http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace ()) , Eclipse afferma che è disponibile in CDC / Foundation 1.1, ma ciò non dice nulla su altri profili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top