Java - ошибки Catching System.load () - PullRequest
7 голосов
/ 23 апреля 2011

Мой главный ():

System.out.println("Start loading libraries");
boolean b2 = false;
try{
  b2 = FileManager.loadBinaries();
} catch (Exception e){
  System.out.println("Exception on loading");
}
System.out.println("Libraries loading ended");

LoadBinaries ():

public static boolean loadBinaries(){
    String os = System.getProperty("os.name").toLowerCase();
    ArrayList<String> bins = new ArrayList<String>();

    if(os.indexOf("windows 7") >= 0 || os.indexOf("windows vista") >= 0){
        bins.add("/nm/metadata/bin/win/libcurld.dll");
        bins.add("/nm/metadata/bin/win/libfftw3f-3.dll");
        bins.add("/nm/metadata/bin/win/libmad.dll");
        bins.add("/nm/metadata/bin/win/libsamplerate.dll");
        bins.add("/nm/metadata/bin/win/seven/mylib.dll");
    }
    else if(os.indexOf("windows xp") >= 0){
        bins.add("/nm/metadata/bin/win/libcurld.dll");
        bins.add("/nm/metadata/bin/win/libfftw3f-3.dll");
        bins.add("/nm/metadata/bin/win/libmad.dll");
        bins.add("/nm/metadata/bin/win/libsamplerate.dll");
        bins.add("/nm/metadata/bin/win/xp/mylib.dll");
    } else if(os.indexOf("mac") >= 0){
        return false;
    }

    File f = null;
    for(String bin : bins){
        InputStream in = FileManager.class.getResourceAsStream(bin);
        byte[] buffer = new byte[1024];
        int read = -1;
        try {
            String[] temp = bin.split("/");
            f = new File(LIB_FOLDER + "/" + temp[temp.length-1]);
            File realF = new File(f.getAbsolutePath());

            if(!realF.exists()){
                FileOutputStream fos = new FileOutputStream(realF);

                while((read = in.read(buffer)) != -1) {
                    fos.write(buffer, 0, read);
                }
                fos.close();
                in.close();
            }
            System.out.println("Hello Load");
            System.load(f.getAbsolutePath());
            System.out.println("Bye Load");
        } catch (Exception e) { System.out.println("Bye Exception"); FileManager.log(e.getMessage(), true); librariesLoaded = false; return false; }
    }

    System.out.println("Bye Method");
    librariesLoaded = true;
    return true;
}

Когда я запускаю эту главную, я получаю следующий вывод:

Start loading libraries
Hello Load
Bye Load
Hello Load
Bye Load
Hello Load
Bye Load
Hello Load
Bye Load
Hello Load
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\java\workspace\Lib\mylib.dll: The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log for more detail
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at nm.player.FileManager.loadBinaries(FileManager.java:264)
    at nm.player.Player.<init>(Player.java:88)
    at nm.player.Player.main(Player.java:523)

Эта ошибка связана с тем, что в ней отсутствуют системные библиотеки C ++. Но моя проблема не в этом. Я беспокоюсь о том, куда программа уходит после этой ошибки! Я не вижу распечатки на защелке, распечатки после цикла в методе и ни распечатки на главной, после выполнения loadbinaries.

Как я могу отловить ошибки этого типа и устранить их? Пример: когда возникает эта ошибка, я хочу напечатать «пожалуйста, введите библиотеки c ++» и управляйте потоком после нее.

Ответы [ 3 ]

20 голосов
/ 23 апреля 2011

Попробуйте заменить

catch (Exception e)

в нижней части вашего loadBinaries() метода с

catch (UnsatisfiedLinkError e)

UnsatisfiedLinkError является подклассом Error, который не является подклассом Exception: Error и Exception являются подклассами Throwable, корнем Java иерархия исключений.

Обычно вы не ловите Error с. Однако, похоже, у вас есть для этого разумное обоснование: вы можете отобразить сообщение для ваших пользователей, говорящее: «Библиотека X отсутствует, пожалуйста, установите ее».

4 голосов
/ 23 апреля 2011

Вы получаете UnsatisfiedLinkError, который является , а не подклассом Exception и, таким образом, не попадает в ваше предложение catch.Если вы хотите, чтобы его поймали, измените catch на catch(Error e).

Видите ли, иерархия исключений в Java немного неинтуитивна.У вас есть два класса, Exception и Error, каждый из которых расширяется Throwable.Таким образом, если вы хотите поймать абсолютно все, что вам нужно поймать Throwable (не рекомендуется).

RuntimException, кстати, является подклассом Exception.

1 голос
/ 23 апреля 2011

Это ошибка. и это хорошая практика, чтобы не ловить ошибки в соответствии с PMD Java.

Вы можете перейти по этой ссылке для получения дополнительной информации

Когда ловить java.lang.Error?

http://pmd.sourceforge.net/rules/strictexception.html

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