首页 > 解决方案 > java.lang.ExceptionInInitializerError 不会消失

问题描述

我正在努力解决这个异常。显然,它可以在初始化静态变量或静态块时抛出。我得到的是

java.lang.ExceptionInInitializerError

在我初始化变量的默认值的那一行

var prefOctaveIndex = 9

以及在onCreate我的主要活动中,我从共享首选项中读取它是否需要被覆盖

val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
prefOctaveIndex = sharedPreferences.getString("octave", "9")?.toInt()!!

例外是Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference在第 12 行

fun calculateMonzo(numInput: Long, denInput: Long): MutableList<Long> {
    var num = numInput
    var den = denInput

    val monzo = mutableListOf<Long>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    for (i in 0..14) while (num % primes[i] == 0L) { // THIS LINE //
        monzo[i]++
        num /= primes[i]
    }
    for (i in 0..14) while (den % primes[i] == 0L) {
        monzo[i]--
        den /= primes[i]
    }
    monzo.add(num)
    monzo.add(den)
    return monzo // length = 17
}

和这个类的第 10 行,它调用了上面的函数。

class Ratio private constructor(
        val num: Long,
        val den: Long,
        val monzo: List<Long>
) {
    constructor(monzo: List<Long>) : this(calculateRatio(monzo).first, calculateRatio(monzo).second, monzo)

    constructor(num: Long, den: Long) : this(num, den, calculateMonzo(num, den)) // THIS LINE //

    val sizeInCents: Double = calculateCents(num, den)
    val centDeviation: Pair<String, Double> = calculateCentDeviation(num, den, monzo)
    val notation: Triple<String, String, String> = calculateNotation(monzo)
    val frequency: Double = calculateFrequency(num, den)
    val hd: Double = calculateHD(num, den)
    val bendSibelius = calculateSibeliusBend(centDeviation.second, sizeInCents)
    val bendFinale = calculateFinaleXBend(centDeviation.second, sizeInCents)
}

完整的堆栈,以防它更有帮助,但我的应用程序已经非常大,所以不知道从哪里开始共享更多代码片段。

java.lang.ExceptionInInitializerError
        at org.plainsound.hejicalc.ValsVarsKt.setPrefOctaveIndex(ValsVars.kt:37)
        at org.plainsound.hejicalc.MainActivity.onCreate(MainActivity.kt:48)
        at android.app.Activity.performCreate(Activity.java:8000)
        at android.app.Activity.performCreate(Activity.java:7984)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
        at org.plainsound.hejicalc.FunctionsKt.calculateMonzo(Functions.kt:12)
        at org.plainsound.hejicalc.Ratio.<init>(Ratio.kt:10)
        at org.plainsound.hejicalc.ValsVarsKt.<clinit>(ValsVars.kt:94)
        at org.plainsound.hejicalc.ValsVarsKt.setPrefOctaveIndex(ValsVars.kt:37) 
        at org.plainsound.hejicalc.MainActivity.onCreate(MainActivity.kt:48) 
        at android.app.Activity.performCreate(Activity.java:8000) 
        at android.app.Activity.performCreate(Activity.java:7984) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

我不太明白,因为该应用程序运行了好几个星期。

标签: javaandroidkotlin

解决方案


我相信primes变量在使用之前没有被初始化。


推荐阅读