当前位置: 代码迷 >> Android >> 我无法弄清楚这个.init()方法如何工作
  详细解决方案

我无法弄清楚这个.init()方法如何工作

热度:21   发布时间:2023-08-04 10:14:10.0

我有问题

简单地说,输入启动代码,

在这里

这是我的代码

一等奖

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "example.com.ollietest001"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.michaelpardo:ollie:0.3.1'
    provided 'com.michaelpardo:ollie-compiler:0.3.1'
}

其次,MainActivity.java

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

import ollie.Ollie;

public class MainActivity extends Activity {
    public static final String Test = "test.db";
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;

        Ollie.with(mContext)
                .setName(Test)
                .setVersion(1)
                .setLogLevel(Ollie.LogLevel.FULL)
                .setCacheSize(1024)
                .init();
    }

}

它只是返回了NullPointerException。

我不明白,为什么?

Caused by: java.lang.NullPointerException
            at ollie.Ollie$DatabaseHelper.executeCreate(Ollie.java:336)
            at ollie.Ollie$DatabaseHelper.onCreate(Ollie.java:317)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
            at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
            at ollie.Ollie.init(Ollie.java:143)
            at ollie.Ollie$Builder.init(Ollie.java:298)
            at example.com.dbtest001.MainActivity.onCreate(MainActivity.java:39)
            at android.app.Activity.performCreate(Activity.java:5179)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
            at android.app.ActivityThread.access$700(ActivityThread.java:143)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4961)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
            at dalvik.system.NativeStart.main(Native Method)

从未使用过库,但是栈跟踪和源很容易推断:

at ollie.Ollie$DatabaseHelper.executeCreate(Ollie.java:336)

for (ModelAdapter modelAdapter : sAdapterHolder.getModelAdapters()) {

NPE必须是sAdapterHoldernull 它在init()的try块中init()

try {
    Class adapterClass = Class.forName(AdapterHolder.IMPL_CLASS_FQCN);
    sAdapterHolder = (AdapterHolder) adapterClass.newInstance();
} catch (Exception e) {
    if (sLogLevel.log(LogLevel.BASIC)) {
        Log.e(TAG, "Failed to initialize.", e);
    }
}

之后,代码将继续其他初始化。 这似乎是库中的错误,应该放弃那里的异常。

AdapterHolder.IMPL_CLASS_FQCN

public static final String IMPL_CLASS_PACKAGE = "ollie";
public static final String IMPL_CLASS_NAME = "AdapterHolderImpl";
public static final String IMPL_CLASS_FQCN = IMPL_CLASS_PACKAGE + "." + IMPL_CLASS_NAME;

这似乎是另一个错误:尝试通过不存在的名称加载类。

建议:不要使用对您不起作用的库,除非您愿意花费时间和精力进行调试和修复其内部。

  相关解决方案