java - 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)
我不太明白,因为该应用程序运行了好几个星期。
解决方案
我相信primes
变量在使用之前没有被初始化。
推荐阅读
- java - 在多对多 Java 中删除实体
- java - 将日期时间、日出和日落从毫秒转换为实时格式
- kubernetes-helm - 如何将 helm 图表直接安装为图像?
- excel - 在单独的单元格中指定月份和年份后,如何创建一个月内所有日期的行?
- android - 安卓 | 简单日期格式 | 字符串到日期 | 嗯,年年
- html - 有没有办法可以只使用 HTML/CSS 放大带有链接标签的任何文本/图片?
- ios - iphone 12 mini 的导航栏背景图像着色不正确
- reactjs - 变量不从函数返回。(参考错误:找不到变量:list2)
- python-3.x - python - 将df转换为时间序列
- elasticsearch - 如何为 APM 代理配置堆配置