2010-11-05 84 views
2

我正在使用一個Android項目,該項目使用來自單獨JAR文件的類和方法我也在創建,並且問題出在一個名爲XpathUtil的特定util類,每次嘗試時拋出一個VerifyError調用其靜態方法之一。java.lang.VerifyError

這裏是我XpathUtil類看起來像:

public class XpathUtil { 

private static XPath xpath = XPathFactory.newInstance().newXPath(); 
private static String TAG = "XpathUtil"; 

public static Document createXpathDocument(String xml) { 
    try { 

    Log.d(TAG , "about to create document builder factory"); 
    DocumentBuilderFactory docFactory = DocumentBuilderFactory 
    .newInstance(); 
    Log.d(TAG , "about to create document builder "); 
    DocumentBuilder builder = docFactory.newDocumentBuilder(); 

    Log.d(TAG , "about to create document with parsing the xml string which is: "); 

    Log.d(TAG ,xml); 
    Document document = builder.parse(new InputSource(
    new StringReader(xml))); 

    Log.d(TAG , "If i see this message then everythings fine "); 

    return document; 
    } catch (Exception e) { 
    e.printStackTrace(); 
    Log.d(TAG , "EXCEPTION OCCURED HERE " + e.toString()); 
    return null; 
    } 
} 

public static NodeList getNodeList(Document doc, String expr) { 
    try { 
    Log.d(TAG , "inside getNodeList"); 
    XPathExpression pathExpr = xpath.compile(expr); 
    return (NodeList) pathExpr.evaluate(doc, XPathConstants.NODESET); 
    } catch (XPathExpressionException e) { 
    e.printStackTrace(); 
    } 
    return null; 
} 

// extracts the String value for the given expression 
public static String getNodeValue(Node n, String expr) { 
    try { 
    Log.d(TAG , "inside getNodeValue"); 
    XPathExpression pathExpr = xpath.compile(expr); 
    return (String) pathExpr.evaluate(n, XPathConstants.STRING); 
    } catch (XPathExpressionException e) { 
    e.printStackTrace(); 
    } 
    return null; 
} 
} 

而這正是例外,從主體工程發生的確切行,我有工作:

mDocument = XpathUtil.createXpathDocument(xml); 

正如你所看到的,我所做的只是簡單地調用createXpathDocument,它位於一個單獨的jar文件中,該文件已被成功導入並通過eclipse包含在我的構建路徑中(任何其他的調用我都可以從此jar中的不同類運行良好)。所以我不太確定問題是什麼。

我嘗試做一個乾淨的和建立在主要項目和我使用的其他項目上,然後將它導出到一個實際的jar文件供第三方應用程序使用,但由於一些奇怪的原因,這個XpathUtil不起作用。

編輯:這裏是例外:

Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 
java.lang.RuntimeException: An error occured while executing doInBackground() 
    at 

android.os.AsyncTask$3.done(AsyncTask.java:200) 
    at 

java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) at 

java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    at 

java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    at 

java.util.concurrent.FutureTask.run(FutureTask.java:137) at 

java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
at 

java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
    at 

java.lang.Thread.run(Thread.java:1096) 
Caused by: java.lang.VerifyError: 

com.kc.unity.agent.util.xml.XpathUtil at com.kc.unity.agent.util.xml.ContactDescHelper.<init> 

(ContactDescHelper.java:67) 
    at 

com.kc.unity.agent.federation.contacts.ContactPlatformWrapper.constructContactDetails 

(ContactPlatformWrapper.java:218) 
    at 

com.kc.unity.agent.federation.contacts.ContactPlatformWrapper.getContactDetails 

(ContactPlatformWrapper.java:101) at 

com.kc.unified.contacts.ContactDetails.setContactFields(ContactDetails.java:154) at com.kc.unified.contacts.ContactDetails.access$6 

(ContactDetails.java:150) at 

com.kc.unified.contacts.ContactDetails$LoadScreen.doInBackground(ContactDetails.java:79) 
    at 

com.kc.unified.contacts.ContactDetails$LoadScreen.doInBackground(ContactDetails.java:1) 
    at android.os.AsyncTask$2.call(AsyncTask.java:185) at 

java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)... 4 more 
+2

如果您給出包括堆棧跟蹤在內的錯誤的實際文本將會很有用。有幾件事可能會導致'VerifyErrors',目前不可能做更多的猜測。 – 2010-11-05 11:53:30

+0

如果你有jar的源代碼,你可以嘗試在主項目中包含源代碼而不是jar,看看問題是否仍然存在?只是爲了確保實用程序不使用Android中不支持的內容。 – 2010-11-05 11:56:13

+0

這就是我設置Suresh的方式,我首先通過eclipse> properties> java build path> projects將整個項目添加到構建路徑中。 我將包括實際的異常 – jonney 2010-11-05 12:04:50

回答

2

導致VerifyErrors一個典型的例子:你有兩個不同版本的庫,編譯於version 1和2與版本上運行。在這種情況下,特別是如果方法簽名已更改,則JVM可能會投訴VerifyError

因此,對於你的情況:仔細檢查你使用非常相同的XPathUtil.class文件來構建和執行。也許JVM在類路徑中有這個類的舊版本(也許它有多個版本並選擇錯誤版本)。

+0

也許我可以看到如果我重構並重命名XPathUtil類會發生什麼?據我所知,我沒有兩個版本的我已經實施的圖書館類。只是那個鏈接到我的主項目 – jonney 2010-11-05 13:22:27

+0

@jonney - 好主意。如果你運行一箇舊的庫,如果所有的錯誤消失了,你可能會得到一個NoClassDefFoundError,那麼你在類路徑中有兩個這個類的入口。 – 2010-11-05 13:25:33

+0

沒有它仍然diddnt工作後重構類的名稱包括在ot – jonney 2010-11-05 14:12:18

2

當我updata ADT工具版本18.0.0.v201203301601-306762 我也得到例外,當我運行應用程序.... 終於我找到解決方案與ADT更新問題。 當您構建android應用程序項目時,您需要進入項目Properties-> Order and Export,並讓第三方jar複選框被選中,並清理並重建項目。 該問題將被修復...... for example let the third party jar checkbox to be checked