我目前正在實施基於沙丁魚(https://github.com/lookfirst/sardine)的Android WebDAV客戶端。 Android客戶端針對API級別15(min-Api級別)。Android上的沙丁魚webdav客戶端
現在我想通過沙丁魚工廠類這樣的初始化連接:
sardine = SardineFactory.begin(user, password);
這段代碼被嵌入的活動中,也應檢查證書是否有效。通過按一個的AsyncTask啓動活動上的確定按鈕。當我調試Android應用程序中嵌入上述
AsyncTask<ServerCredentials, Void, ServerCredentials> verifyCredentialsTask = new AsyncTask<String[], Void, boolean>(){
@Override
protected boolean doInBackground(String[]...c) {
try {
String user = c[0];
String password = c[1]
sardine = SardineFactory.begin(user, password);
return true;
}
catch (Exception e) {
return false;
}
};
@Override
protected void onPostExecute(ServerCredentials sc) {
final Intent intent = new Intent();
...
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK);
finish();
}
};
的代碼行,我起牀到沙丁魚首先從SardineFactory initialzed點。如果我跨過這一行,將引發ExceptionInInitializerError。雖然,有一個try catch語句,整個活動崩潰和下面的異常跟蹤,可以在logcat的窗口中可以看出:
E/AndroidRuntime(10996): FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime(10996): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(10996): at android.os.AsyncTask$3.done(AsyncTask.java:299)
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
E/AndroidRuntime(10996): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
E/AndroidRuntime(10996): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
E/AndroidRuntime(10996): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
E/AndroidRuntime(10996): at java.lang.Thread.run(Thread.java:856)
E/AndroidRuntime(10996): Caused by: java.lang.ExceptionInInitializerError
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:45)
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:34)
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:22)
我已經尋找一個答案的網站。 ExceptionInInitializerError的定義是通用的(https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/ExceptionInInitializerError.html)。
如果我將源代碼附加到引用的sardine.jar中,我可以調試到begin方法和它們的重載。被稱爲的最終「開始」方法定義爲
public static Sardine begin(String username, String password, ProxySelector proxy)
{
try {
return new SardineImpl(username, password, proxy);
} catch (Exception e) {
e.printStackTrace();
return null;
}
似乎導致該問題。
正如你所看到的,我已經用try catch修改了它,以查看我是否可以捕獲拋出的異常。但是一旦我跨過SardineImpl構造器,ExceptionInInitializerError就會被拋出。我沒有機會抓住它。
我認爲,有些圖書館仍然失蹤。我在eclipse中通過maven構建腳本構建了sardine.jar(乾淨安裝)。源是不變的,除了我添加了以下缺失的庫
ant-1.9.2.jar
commons-codec-1.6.jar
commons-logging-1.1.3.jar
httpclient-4.5.jar
httpcore-4.3.2.jar
slf4j-api-1.7.12.jar
slf4j-jdk14-1.7.12.jar
在Eclipse項目設置的鉤子(Java構建路徑 - >在線訂單和出口)爲所有外部庫設置。因此,我認爲當APK構建並安裝在目標設備上時,什麼也不會丟失。
有沒有人遇到過類似的問題?我如何解釋ExceptionInInitializerError異常?