Имеет программа, распознают, что она отказала в прошлый раз?

В Objective C синтаксис @"foo" неизменен , литерал экземпляр NSString. Это не делает постоянную строку из строкового литерала, как Mike предполагает.

компиляторы Objective C обычно делают литеральные строки интерна в единицах компиляции — то есть, они объединяют совместные использования той же литеральной строки —, и для компоновщика возможно сделать дополнительное интернирование через единицы компиляции, которые непосредственно связаны в единственный двоичный файл. (Так как Какао различает изменяемые и неизменные строки, и литеральные строки всегда также неизменны, это может быть просто и безопасно.)

строки Constant, с другой стороны, обычно объявляются и определили синтаксис использования как это:

// MyExample.h - declaration, other code references this
extern NSString * const MyExampleNotification;

// MyExample.m - definition, compiled for other code to reference
NSString * const MyExampleNotification = @"MyExampleNotification";

точка синтаксического осуществления здесь - то, что можно сделать использование строка эффективный путем обеспечения, что существует только один экземпляр той строки, используемой даже через несколько платформ (совместно использованные библиотеки) в том же адресном пространстве. (Размещение const вопросы ключевого слова; это гарантирует, что сам указатель, как гарантируют, будет постоянным.)

, В то время как горящая память не является столь большим соглашением, как это, возможно, было в эпоху 25 МГц, 68 030 рабочих станций с 8 МБ RAM, сравнивая строки для равенства могут занять время. Обеспечение, что большинство строк времени, которые равны, также будет равно указателю, помогает.

Говорят, например, Вы хотите подписаться на уведомления от объекта по имени. При использовании непостоянных строк для имен NSNotificationCenter, регистрация уведомления могла бы завершить выполнение большого количества сравнений байта строкой байтов при определении, кто интересуется им. Если большинство этих сравнений закорачивается, потому что сравниваемые строки имеют тот же указатель, который может быть большой победой.

6
задан Epaga 17 November 2009 в 13:13
поделиться

6 ответов

Есть три причины, по которым программа Java может аварийно завершить работу:

  • Необработанное исключение времени выполнения. Это легко решить с помощью try-catch в main .
  • Необработанные ошибки. Они редки, но их также можно отловить в основном . Я обычно ловлю Throwable в main . См. Ниже шаблон.
  • Если вы используете потоки, посмотрите на Thread.setDefaultUncaughtExceptionHandler () .
  • Ошибки в виртуальной машине, или программа, убитая пользователем, или аппаратное принудительное завершение работы. Это приведет к сбою, который невозможно будет поймать. Здесь лучше всего создать где-нибудь файл флага с помощью new File (...). DeleteOnExit () . Java очистит это за вас, если представится шанс.

Проблема с тупиками заключается в том, как определить, что у вас тупик. Я пока не видел последовательного способа сделать это.

import org.apache.commons.lang.exception.ExceptionUtils;

public class Demo
{
    public static void main (String[] args)
    {
        try
        {
            Demo obj = new Demo ();
            obj.run (args);
            System.out.println ("Done.");
        }
        catch (Throwable t)
        {
            ExceptionUtils.printRootCauseStackTrace (t);
        }
    }
}
7
ответ дан 9 December 2019 в 20:45
поделиться

Вариант первого предлагаемого вами решения достаточно распространен в Un * x для процессов: сохранять файл pid запущенного процесса в файле при запуске. Когда программа запускается снова, вы можете проверить, существует ли этот файл еще (и даже если процесс с этим pid запущен).

С Java вы, вероятно, могли бы адаптировать эту идею, используя Threadid, определенный в ThreadMXBean. Но подойдет любой файл. Файл, содержащий ключ, как вы предлагаете, кажется достаточно хорошим способом. Вы также можете поместить в него некоторую полезную информацию, например, о времени последнего выполнения. Если он все еще присутствует при запуске, программа не была полностью остановлена.

Он также может стать чем-то вроде файла журнала запуска, в котором отслеживаются события программы, включая запуск и чистые остановки, и, возможно, блокировки.

2
ответ дан 9 December 2019 в 20:45
поделиться

Я перенаправляю System.err в файл, чтобы любое сообщение об ошибке (например, сбои) попадало в файл, который я мог позже обработать ...

Код для этого довольно прост ...

String errLog = "c:\\myLog";
try 
{
  java.io.PrintStream err = new java.io.PrintStream(new java.io.FileOutputStream(errLog));
  System.setErr(err);
}
catch (java.io.FileNotFoundException fnfe) {}
0
ответ дан 9 December 2019 в 20:45
поделиться

Я собираюсь подражать Маркосу. Создайте файл конфигурации или файл журнала, в котором будет размещено последнее сообщение об ошибке и дата последнего запуска программы. Затем прочтите этот файл во время загрузки программы.

0
ответ дан 9 December 2019 в 20:45
поделиться

Многие из этих ответов касаются отслеживания исключений, из-за которых ваше приложение перестало работать.

Другая возможность состоит в том, что приложение просто завершило работу (т.е. пользователь завершил его работу, выключил компьютер, отключение питания и т. Д. .). Думаю, ваша временная ключевая идея сработает для этого. Это похоже на то, как программы редактирования текста, такие как vi или Word, автоматически создают специальную копию редактируемого файла. При открытии он проверяет, существует ли специальная копия, и спрашивает, хотите ли вы восстановить файл.

0
ответ дан 9 December 2019 в 20:45
поделиться

Сбой при неперехваченном исключении? Использование Thread.setDefaultUncaughtExceptionHandler и отображение сообщения как части сбоя.

Согласно первой идее, как вы обрабатываете несколько экземпляров приложений, работающих одновременно? (Также подумайте о многопользовательских средах.)

Распознавайте взаимоблокировки - Как часто возникают проблемы с взаимоблокировками? Я предполагаю, что вы можете отслеживать состояния потоков на всех «ключевых» потоках.

Тогда у вас есть внешние силы, убивающие приложение, следует ли считать их проблемой, о которой вы должны сообщить? В конце концов, ваше приложение не было виновато в этом случае.

Наконец, всегда сохраняйте «файл ошибок» в виде журнала. Используйте надлежащую структуру ведения журнала (например, Ведение журнала Java или Log4J ).

3
ответ дан 9 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: