Предотвратить NoClassDefFoundError от сбоя программы - PullRequest
2 голосов
/ 31 марта 2011

Я пишу Java-программу для моей рабочей учебной программы, основанной на последовательных драйверах RXTX. Он хорошо работает на моих тестовых машинах, однако я заметил, что при запуске на машине, на которой не установлен RXTX, приложение не открывается. В консоли он выдал исключение «java.lang.NoClassDefFoundError» для «gnu / io / CommPortIdentifier». Я поместил это в try / catch, чтобы вместо этого он отображал пользователю сообщение с просьбой проверить установку драйвера RXTX, а не просто выходить из программы. Однако на самом деле он этого не делает, просто закрывается, как только попадает в эту строку. Есть идеи? Спасибо!

РЕДАКТИРОВАТЬ: код для вас:

Enumeration sportsAll = null;
Vector<String> v = new Vector();
SerialPort sp;
CommPortIdentifier portID;
String currString;

try {
    sportsAll= CommPortIdentifier.getPortIdentifiers();
} catch (Exception e) {
    v.addElement("Check RXTX Drivers");
}

В строке "sportsAll = CommPortIdentifier" выдается ошибка

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

java.lang.Error состояния

Ошибка - это подкласс Throwable , который указывает на серьезные проблемы, которые разумное приложение должно не пытаться отловить .Большинство таких ошибок являются ненормальными условиями.

И java.lang.NoClassDefFoundError расширяет LinkageError (что расширяет Error).Вы не должны вообще ловить Error в блоке try-catch.

Вам нужно будет написать код, чтобы проверить, установлен ли RXTX, прежде чем выполнять оставшуюся часть кода.

4 голосов
/ 31 марта 2011

Это потому, что вы пытаетесь перехватить Exception, который не является родительским классом для NoClassDefFoundError см. JavaDoc .Вместо этого поймайте конкретный класс исключений.

Лучше всего проверить наличие самого драйвера.Например:

private static boolean isDriverAvailable() {    
    boolean driverAvailable = true;

    try {
        // Load any class that should be present if driver's available
        Class.forName("gnu.io.CommPortIdentifier");
    } catch (ClassNotFoundException e) {
        // Driver is not available
        driverAvailable = false; 
    }

    return driverAvailable;
}
1 голос
/ 31 марта 2011

Это потому, что NoClassDefFoundError расширяется Error ( не Exception).

Лучший способ - поймать NoClassDefFoundError. Вы также можете поймать либо Error, либо Throwable.

...