2011-04-23 3 views
5

Mes principales():Java - Attraper System.load() Erreurs

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; 
} 

Quand je lance ce principal je reçois la sortie suivante:

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) 

Cette erreur est due à l'absence de dll système C++. Mais mon problème n'est pas ça. Je suis préoccupé par l'endroit où le programme va après cette erreur! Je ne vois pas l'impression sur la capture, l'impression après la boucle dans la méthode et ni les impressions sur le principal, après loadbinaries est exécuté.

Comment puis-je attraper ce type d'erreur et y faire face? Exemple: Lorsque cette erreur se produit, je veux imprimer "s'il vous plaît intall C++ bibliothèques" et contrôler le flux après elle.

Répondre

15

Essayez de remplacer

catch (Exception e) 

au fond de votre méthode loadBinaries() avec

catch (UnsatisfiedLinkError e) 

UnsatisfiedLinkError est une sous-classe de Error, qui est pas une sous-classe de Exception: Error et Exception sont les deux sous-classes de Throwable, la racine de la hiérarchie des exceptions Java.

Normalement, vous ne saisissez pas Error s. Cependant, il semble que vous ayez des arguments raisonnables pour le faire ici, en ce sens que vous pouvez afficher un message à vos utilisateurs en leur disant que la bibliothèque X est manquante, veuillez l'installer.

3

Vous obtenez une UnsatisfiedLinkError qui est pas une sous-classe de Exception et est donc pas pris par votre clause catch. Si vous voulez qu'il soit pris, changez le crochet à catch(Error e).

Vous voyez, la hiérarchie des exceptions de Java est un peu non intuitive. Vous avez deux classes, Exception et Error, dont chacune s'étend Throwable. Ainsi, si vous voulez attraper absolument tout ce dont vous avez besoin pour attraper Throwable (non recommandé).

RuntimException, en passant, est une sous-classe de Exception.

Questions connexes