Android NoSuchMethodError:java.lang.Long.hashCode
我在Android NoSuchMethodError:java.lang.Long.hashCode,android,intellij-idea,kotlin,Android,Intellij Idea,Kotlin,我在AbstractORM类中的hashCode上重写了以下方法: var _id = Random().nextLong() override fun getId() = _id // AbstractORM class implements an interface that defines this method getId() override fun hashCode() = getId().hashCode() 突然引发以下异常: FATAL EXCEPTION: main j
AbstractORM
类中的hashCode
上重写了以下方法:
var _id = Random().nextLong()
override fun getId() = _id // AbstractORM class implements an interface that defines this method getId()
override fun hashCode() = getId().hashCode()
突然引发以下异常:
FATAL EXCEPTION: main
java.lang.NoSuchMethodError: java.lang.Long.hashCode
at com.company.ormlite.AbstractORM.hashCode(AbstractORM.kt:271)
at java.util.HashMap.put(HashMap.java:390)
at java.util.HashSet.add(HashSet.java:95)
at kotlin.collections.ArraysKt___ArraysKt.toCollection(_Arrays.kt:6518)
at kotlin.collections.ArraysKt___ArraysKt.toSet(_Arrays.kt:6853)
at kotlin.collections.SetsKt__SetsKt.setOf(Sets.kt:32)
at com.company.android.tna.orm.DataManager.getTables(DataManager.kt:16)
at com.company.android.tna.orm.DataManager.getTables(DataManager.kt:10)
at com.company.android.core.utils.AbstractDataManager.create(AbstractDataManager.kt:25)
at com.company.android.core.utils.AbstractDataManager.start(AbstractDataManager.kt:44)
at com.company.android.core.utils.AbstractZKApplication.onCreate(AbstractZKApplication.kt:54)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
at android.app.ActivityThread.access$1300(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
这让我目瞪口呆,原因有几个:
- Java和Kotlin中的所有类都有
方法,因为它是从hashCode
或Object
继承的Any
- 它怎么能找不到Android SDK本身上的方法呢?如果SDK不存在,它是如何运行的
- 在IntelliJ IDEA中检查代码行时,它将我发送到
,而不是kotlin.Any.hashCode
java.lang.Long.hashCode
如果您有任何见解,我们将不胜感激。我不确定如何解决您的问题,但我将尝试解释您为什么会遇到此异常 在Java8中,向
Long
类添加了一个新类:
public static int hashCode(long value)
从那时起,hashCode()
方法如下所示:
public int hashCode() {
return hashCode(this.value); // call Long.hashCode() static method
}
因此,您似乎对Java版本有一些问题。在检查编译的
AbstractORM
类后,我发现了问题:较新的Kotlin版本会为该行生成不同的代码
getId().hashCode()
Kotlin 1.1.2生成以下代码:
Long.valueOf(this.getId()).hashCode()
Kotlin的较新版本生成以下其他代码:
Long.hashCode(this.getId())
问题是,Android中的这个静态方法Long.hashCode(Long)
仅在API 24(Android 7.0)之后才可用,而我正在一个版本为4.1(API 16)的Android设备上进行测试
虽然我已经打开了一个问题,但我正在通过手动计算哈希代码来临时修复
正如对的评论,切换到Kotlin编译器的Java1.6目标会生成旧的兼容代码
PS:我对那些Kotlin版本不是100%确定,请恕我直言。按照m0skit0的建议,重写
hashCode()
函数对我来说很有效。我实施了以下措施:
override fun hashCode() : Int = id.toString().hashCode()
AndroidStudio中我的Kotlin编译器设置为:
- 启用增量编译
- 目标JVM版本。1.6
编译选项和kotlinOptions分配到版本1.8
android {
...
// Configure only for each module that uses Java 8
// language features (either in its source code or
// through dependencies).
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
引用自Android开发者官方网站。你能在导入的同时发布getId()
方法的签名吗?@chandil03我已经添加了请求的信息。没有与这些方法相关的进口。所有导入都来自ORM和java.util的内部库。我们没有其他的Long
实现。我用了你的三行代码,它工作得很好。我没有覆盖getId,因为我不知道您正在使用哪个接口。如果你让我知道你正在实现的接口,那么我可能会帮上忙。@chandil03是的,直到昨天它还对我很有效,所以肯定是我的构建中有什么东西弄乱了它。我认为这个界面一点关系都没有。它只是一个简单的接口,带有getId()方法,仅此而已。将kotlin从1.3.20升级到1.3.30也会导致此问题。请参阅。抱歉,我不明白这是如何解释我的错误的。很可能您正试图在不支持1.8功能的JVM上运行Java 8编译代码。当然不是,这是Android,它总是设置为Java 6。无论如何,我再次检查了Java版本目标,它是6。另外,我没有调用新的静态方法,注意它有一个参数。但它肯定是在我的构建中被破坏的东西,一些Kotlin版本或其他东西,谢谢你让我这样做@m0skit0可能是您的java 6存在此问题,因为它太旧了。尝试切换到7或8。如果在build.gradle文件中覆盖这些设置,请小心:compileKotlin{kotlinOptions{jvmTarget=“1.6”}
@m0skit0我也面临同样的问题,我不想降级到JVM 1.6。您能告诉我如何解决JVM1.8和API级别低于的问题吗24@St我爱上你了。这对人们来说怎么不成问题了?我,比如@Abdulrehmanayawarkhan,如果有帮助的话,不想降级到1.6。@StuStirling很简单:如果你的min SDK小于24,你就不能使用target 1.8。API<24的设备不支持1.8功能。如果您有Kotlin要编译为1.6,那么您就不需要它了。@Ahmedna“只支持旧API”是什么意思?@m0skit0和Kotlin v 1.3.30上周发布,但有1.6 API<24的任何设备都会抛出此错误,grater API工作正常,所以我只需要避免使用这些APImethods@m0skit0我已经将complier设置为1.6,直到上周一切都很好,我更新到kotlin 1.3.30,所有api<24的用户都开始崩溃,我用1.6和kotlin的旧版本调试所有api都正常工作,然后使用kotlin 1.3.30 24之前的所有API崩溃如果您想升级到Java 8,是的,这是有效的解决方案。
android {
...
// Configure only for each module that uses Java 8
// language features (either in its source code or
// through dependencies).
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}