Как получить текст трассировки стека исключений в Java ME?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

В обычной Java вы можете получить текст трассировки стека, передав PrintWriter в printStackTrace .У меня такое чувство, что я знаю ответ на этот вопрос (т. е."Нет"), но,

Есть ли какой-нибудь способ получить текст трассировки стека в JavaME в виде строки?

Обновить:

Я должен упомянуть, что я ограничен CLDC 1.0

Это было полезно?

Решение

AFAIK нет способа получить трассировку стека в виде строкового значения, если только конкретная платформа не предоставляет средства для переопределения потока System.err по умолчанию.На платформе BlackBerry он выдает трассировку стека на catch(Exception) однако, чтобы сэкономить память, он не делает этого на catch(Throwable) и предоставляет доступ к трассировке стека через журнал событий устройства.

В итоге я поймал Throwable, а не Exception в последний возможный момент и распечатал оттуда трассировку стека.Это, конечно, сопряжено с опасностью, что вы тоже заразитесь java.lang.Error что не очень хорошо, особенно если его OutOfMemoryError, хотя призыв к System.gc() перед печатью трассировка стека, по-видимому, снижает риск, и у нас не было с этим никаких проблем.

Я бы посмотрел на любую платформу, на которую вы ориентируетесь, и посмотрел, предоставляют ли они где-нибудь доступ к System.err.Вы всегда можете подключить отладчик, и он должен появиться в выводе консоли, хотя звучит так, как будто вы хотите получить трассировки стека "в поле".

Другие советы

два решения:

  • воспроизведите исключение в эмуляторе.wireless toolkit и Netbeans распечатают трассировки стека на вашем компьютере.

  • используйте устройство на платформе Symbian.

До выхода Feature Pack 2 3rd edition Series 60 телефоны Symbian использовали виртуальную машину Java Sun Hotspot.Он был адаптирован для Symbian OS путем привязки его к частичной реализации стандартной библиотеки C.

Это позволило Symbian создать программу на C ++ под названием redirector, которая была способна фиксировать стандартный вывод виртуальной машины и стандартную ошибку, включая трассировки стека исключений Java.

перенаправитель c ++ никогда не обновлялся для версии 9 ОС Symbian.Вместо этого в виртуальную машину был введен протокол GCF "redirect: //",

Из отдельного мидлета откройте входной поток из соединения, возвращаемого Connector.open("перенаправление://", Connector.READ);затем вы можете записывать трассировки стека исключений на телефонах Symbian.

Редактировать :"redirect: //" вернулся в Series60 5th edition, а "redirect: // test" должен работать в Series60 3rd edition feature pack 2

Я не думаю, что есть способ сделать это в CLDC 1.0.Однако на некоторых устройствах / операционных системах базовый класс Exception может предоставлять способ доступа к трассировке стека (подумайте о более новых версиях CLDC).Просто проверьте экземпляр exception во время выполнения с помощью reflection, чтобы увидеть, какие элементы он предоставляет на ваших целевых платформах.Затем вы могли бы написать некоторый код, который сможет безопасно извлекать трассировку стека на платформах, предлагающих такую информацию.

Я создал инструмент, который можно использовать для регистрации правильных трассировок стека также в CLDC.Проверьте это по адресу http://jarrut.sourceforge.net.Он все еще очень новый и, возможно, имеет некоторые шероховатости, но у меня он работает, и я больше не могу представить разработку мидлетов без него.Лучший способ использовать его - объединить с microlog.

К сожалению, в настоящее время инструмент требует CLDC 1.1, поэтому он может не решить проблему с оригинальным плакатом.

Вы можете заставить PrintWriter записать в ByteArrayOutputStream и восстановить строку из байтов.

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

Это некрасиво, но должно работать практически везде.Прежде чем попробовать вышеописанное, убедитесь, что у вас нет доступа к [Throwable#getStackTrace] (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace ()), Eclipse утверждает, что он доступен в CDC / Foundation 1.1, но это ничего не говорит о других профилях.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top