Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NoSuchMethodError:java.lang.Long.hashCode_Android_Intellij Idea_Kotlin - Fatal编程技术网

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

我遇到了同样的问题,我的解决方案是将build.gradle中的
编译选项和
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"
  }
}