【问题标题】:Java lang Verify error in call to constructor in my appJava lang 在我的应用程序中调用构造函数时验证错误
【发布时间】:2026-01-04 23:35:01
【问题描述】:

我正在通过以下方式创建一个线程:

GraphThread  thread = new GraphThread(context, handler, string);

请注意,处理程序是一个静态处理程序对象,这可能会导致问题。我一直在这行代码中遇到错误。但是,在 API 23 和 25 等其他虚拟设备以及我的物理设备(牛轧糖)中没有出现该错误。

我确实尝试设置一个 try{}catch 块,但它没有捕获异常,这很不寻常。堆栈跟踪如下:

java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
        at android.view.View.performClick(View.java:4438)
        at android.view.View$PerformClick.run(View.java:18422)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException**
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick**(AppCompatViewInflater.java:384)
        at android.view.View.performClick(View.java:4438) 
        at android.view.View$PerformClick.run(View.java:18422) 
        at android.os.Handler.handleCallback(Handler.java:733) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:136) 
        at android.app.ActivityThread.main(ActivityThread.java:5017) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
        at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.VerifyError: noodlesoup/solver/GraphThready
        at noodlesoup.solver.MainActivity.clikButton(MainActivity.java:4985)

归结为 java.lang Verifyerror 我相信是通过传递参数静态处理程序创建的。我不知道为什么会在 API 19 虚拟设备中发生这种情况,而不是在我测试过的其他虚拟设备中。

有什么想法或建议吗?

【问题讨论】:

  • 是你的应用程序的noodlesoup/solver/GraphThready包的一部分还是它的依赖?您能否将调用的方法发布到您的 MainActivity(clikButton)
  • 是我的应用程序中的一个线程类。不是,依赖。但是,我使用了几个库来在这个线程中创建图表。 @AnisBENNSIR
  • 所以,如果编译版本与运行时版本不同,基本上会抛出 VerifyError,这可能是由于某些 gradle 排除传递依赖...或损坏的 jar/aar 依赖...请添加你的毕业典礼?
  • 如果甚至没有创建 Thread 对象,为什么它与传递依赖有关。甚至没有调用构造函数。创建线程对象后,代码开始调用 3rd 方库进行计算。 @AnisBENNSIR
  • 好的,你的线程类依赖于库中的其他类,类加载器也可能加载它们...你可以尝试使用外部库注释代码并检查问题是否是由于外部依赖与否,如果是,可以逐个开启依赖,找到这个错误的来源...

标签: android invocationtargetexception verifyerror


【解决方案1】:

看了很多帖子,我想到了一个想法:我的Thread类中的void run方法太复杂了。 run 方法内部定义的变量太多;在一个包含 4000 多行代码的方法中,要做出的决定太多。给我这个想法的帖子和答案如下 VerifyError - Verifier rejected class

所以,我所要做的就是在 Thread 类中创建额外的方法是 他们的工作相当于 run 方法中的 4000 多行代码。

最后 Thread 类结构是这样的,它编译后没有更多的验证错误:

public class GraphThready extends Thread{
//...
GraphThready(){
//...
}

public void run(){

super.run();

if(some condition)
methodToDoTask1();

if(another condition)
methodToDoTask2();

if(a different condition)
methodToDoTask3();

}

private void methodToDoTask1(){

}


private void methodToDoTask2(){

}

private void methodToDoTask3(){

}

}

【讨论】:

    最近更新 更多