2011-04-23 24 views
5

मेरा मुख्य():जावा - पकड़ने System.load() त्रुटियाँ

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():

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) 
:

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

जब मैं इस मुख्य चलाने मैं अगले आउटपुट प्राप्त

यह त्रुटि है क्योंकि यह कुछ C++ सिस्टम dlls गायब है। लेकिन मेरी समस्या यह नहीं है। इस चिंता के बाद कार्यक्रम कहां जाता है इस बारे में मुझे चिंता है! मुझे कैच पर प्रिंट नहीं दिखता है, विधि में लूप के बाद प्रिंट और न तो मुख्य पर प्रिंट, लोडबिनरी निष्पादित होने के बाद।

मैं इस प्रकार की त्रुटियों को कैसे पकड़ सकता हूं और उनसे निपट सकता हूं? उदाहरण: जब यह त्रुटि होती है, तो मैं "कृपया C++ लाइब्रेरी को इंटेल करें" प्रिंट करना चाहता हूं और उसके बाद प्रवाह को नियंत्रित करना चाहता हूं।

उत्तर

15

के साथ अपने loadBinaries() विधि के तल पर

catch (Exception e) 

के बजाय ऐसे

UnsatisfiedLinkErrorError का एक उपवर्ग है, जो है नहींException का एक उपवर्ग: Error और ExceptionThrowable के दोनों उपवर्गों हैं, जावा अपवाद पदानुक्रम की जड़।

आम तौर पर, आपको Error एस नहीं मिलता है। हालांकि, ऐसा लगता है कि आपके पास ऐसा करने के लिए एक उचित मामला है, जिसमें आप अपने उपयोगकर्ताओं को एक संदेश प्रदर्शित कर सकते हैं कि 'लाइब्रेरी एक्स गुम है, कृपया इसे इंस्टॉल करें'।

1

इसकी एक त्रुटि है। और जावा पीएमडी के अनुसार त्रुटियों को पकड़ने के लिए इसका अच्छा अभ्यास नहीं है।

आप अधिक जानकारी के लिए इन लिंक का अनुसरण कर सकते हैं

When to catch java.lang.Error?

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

+0

हालांकि यह एक अच्छा सामान्य नियम है कि 'त्रुटि' या उसके उप-वर्गों को पकड़ने के लिए नहीं, यह मामला अपवाद प्रतीत होता है। –

3

आप एक UnsatisfiedLinkError जो Exception का एक उपवर्ग नहीं है और इस तरह अपने catch खंड द्वारा पकड़ा नहीं है हो रही है। यदि आप इसे पकड़ा जाना चाहते हैं तो catch(Error e) पर पकड़ बदलें।

आप देखते हैं, जावा का अपवाद पदानुक्रम थोड़ा अनजान है। आपके पास दो कक्षाएं हैं, Exception और Error, जिनमें से प्रत्येक Throwable फैली हुई है। इस प्रकार, यदि आप थ्रोबल (अनुशंसित नहीं) पकड़ने के लिए आपको जो कुछ भी चाहिए, उसे पकड़ना चाहते हैं।

RuntimException, वैसे, Exception का उप-वर्ग है।

संबंधित मुद्दे