我目前正在为基于sardine(https://github.com/lookfirst/sardine)的Android实现WebDAV客户端。 Android客户端的目标是API级别15(最低Api级别)。

现在,我想通过使用Sardine Factory类来初始化连接,如下所示:

sardine = SardineFactory.begin(user, password);


这段代码嵌入了一个Activity中,该Activity将检查凭据是否有效。通过单击“活动”的“确定”按钮,将启动AsyncTask,它将上面的代码行嵌入

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


当我调试android应用程序时,我到达了从SardineFactory首先初始化沙丁鱼的地步。如果我跳过这条线,则会引发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。我没有机会抓住它。

我认为某些图书馆仍然缺失。我正在通过Maven构建脚本(全新安装)在Eclipse中构建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 Build Path-> Order and Export)中的挂钩是为所有外部库设置的。因此,当在目标设备上构建并安装APK时,我认为没有任何丢失。

有没有人遇到过类似的问题?如何解释ExceptionInInitializerError异常?

最佳答案

只是为了解决这个问题。由于这个事实,我想通过webdav访问ownCloud实例,所以我决定删除沙丁鱼库,然后选择本机的ownCloud库(https://github.com/owncloud/android-library)。该库包括一个很好的示例客户端,并且非常适合我的项目。

谢谢

10-05 19:35