Как диагностировать «необработанные исключения» в Java? - PullRequest
0 голосов
/ 16 ноября 2009

В Java-программе в настоящее время я получаю «Необработанное исключение» в определенный момент в программе, и я не могу определить, где это генерируется.

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

Какую стратегию мне выбрать, чтобы найти исключение?

Ответы [ 5 ]

11 голосов
/ 16 ноября 2009

Реализуйте интерфейс Thread.UncaughtExceptionHandler и используйте setDefaultUncaughtExceptionHandler() для его установки.

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

public class Test {
  public static void main(String args[]) {
      new Test();
  }
  public Test() {
      Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
      // or if a default handler is set you can also use setUncaughtExceptionHandler
      // check the javadocs for the specifics
      throw new RuntimeException ("You can't get me or can you?");
  }
  class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
      public void uncaughtException(Thread t, Throwable e) {
          System.err.println ("Uncaught exception by " + t + " caught:");
          e.printStackTrace();
      }
  }
}
1 голос
/ 16 ноября 2009

Звучит так, будто где-то происходит непроверенное исключение RuntimeException. Вы можете легко попробовать это в вашем методе main () с помощью try {} catch (Throwable t) {t.printStackTrace (); }

Или, если вы удаленно отлаживаете его с помощью IDE, такой как Eclipse, вы можете настроить его так, чтобы он вызывал отладчик на точку останова исключения Java с «Suspend on uncaught excptions». Некоторые документы здесь .

1 голос
/ 16 ноября 2009

Но как я запускаю программу устройства показывает «необработанное исключение» и спрашивает мне ли закрыть приложение.

Сначала вам нужно найти место в коде, который генерирует это сообщение. Похоже, что приложение имеет графический интерфейс или что-то еще, так что возможен диалог какого-то рода.

Затем найдите место в коде, которое вызывает создание сообщения / диалога. Это может быть либо

  • a try / catch блок, который ловит Exception или Throwable, или
  • и UncaughtExceptionHandler.

В любом случае, следующим шагом является добавление некоторого кода, чтобы приложение выводило трассировку стека для необработанного исключения. Предполагая, что ex содержит ссылку на объект исключения:

    ex.printStackTrace();

запишет трассировку стека в стандартный поток ошибок; например «консоль». (Существуют более тяжелые решения, если вы не можете найти, куда выводится «консоль».)

1 голос
/ 16 ноября 2009

Вы можете поместить блок try-catch (Exception ex) вокруг разделов кода и переместить его / сжать блок и сделать так, чтобы регистрировалось выбрасываемое исключение. Пока не слишком много кода, вы сможете отследить его за несколько прогонов.

1 голос
/ 16 ноября 2009

Если у вас нет стека трассировки, вы не можете сделать много.

Если это действительно вызвано на другой стороне, и вы получили это как сообщение, то вам следует запросить у другой стороны трассировку стека или подобную информацию.

Редактировать : конечно, вы должны убедиться, что ваш собственный код не поглощает исключения, такие как:

} catch (Exception e) {
    // Do nothing.
}

или

} catch (Exception e) {
    System.out.println("Error");
}

или

} catch (Exception e) {
    System.out.println(e.toString());
}

Чтобы получить максимальную информацию из исключений, вы должны сделать как минимум:

} catch (Exception e) {
    e.printStackTrace();
}

или просто

} catch (Exception e) {
    throw e;
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...