gpt4 book ai didi

java - 堆栈操作时出现奇怪的错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:46:04 24 4
gpt4 key购买 nike

作为我使用名为 JIST/SWANS 的工具运行的一些模拟的一部分,我遇到了一些奇怪的错误。这个模拟器是为 Java 1.4 编写的,我正在尝试将其移植到 1.5。

我想做的是用1.5 SDK编译原始代码。问题是模拟器使用bcel重写字节码,以便使用 JVM 进行模拟。当我在新的 SDK 下编译代码时,出现以下错误。有人可以指出我正确的方向来解决这个问题吗?我知道 1.4 和 1.5 生成的字节码有些不同,但我不知道从哪里开始寻找。

java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.remove(ArrayList.java:390)
at org.apache.bcel.verifier.structurals.OperandStack.pop(OperandStack.java:135)
at org.apache.bcel.verifier.structurals.ExecutionVisitor.visitPUTFIELD(ExecutionVisitor.java:1048)
at org.apache.bcel.generic.PUTFIELD.accept(PUTFIELD.java:78)
at jist.runtime.RewriterFlow.execute(RewriterFlow.java:235)
at jist.runtime.RewriterFlow.doFlow(RewriterFlow.java:187)
at jist.runtime.RewriterTraversalContinuableMethods.doMethod(Rewriter.java:3059)
at jist.runtime.ClassTraversal.processMethodGen(ClassTraversal.java:136)
at jist.runtime.ClassTraversal.processClassGen(ClassTraversal.java:96)
at jist.runtime.ClassTraversal.processClass(ClassTraversal.java:63)
at jist.runtime.Rewriter.rewriteClass(Rewriter.java:621)
at jist.runtime.Rewriter.findClass(Rewriter.java:410)
at jist.runtime.Rewriter.loadClass(Rewriter.java:367)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethod(Class.java:1935)
at jist.swans.app.AppJava.findMain(AppJava.java:86)
at jist.swans.app.AppJava.<init>(AppJava.java:61)
at driver.aodvtest.createNode(aodvtest.java:192)
at driver.aodvtest.createSim(aodvtest.java:235)
at driver.aodvtest.main(aodvtest.java:277)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at jist.runtime.Bootstrap$JavaMain.startSimulation(Bootstrap.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at jist.runtime.Controller.processEvent(Controller.java:650)
at jist.runtime.Controller.eventLoop(Controller.java:428)
at jist.runtime.Controller.run(Controller.java:457)
at java.lang.Thread.run(Thread.java:619)

java.lang.NullPointerException
at driver.aodvtest.createNode(aodvtest.java:198)
at driver.aodvtest.createSim(aodvtest.java:235)
at driver.aodvtest.main(aodvtest.java:277)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at jist.runtime.Bootstrap$JavaMain.startSimulation(Bootstrap.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at jist.runtime.Controller.processEvent(Controller.java:650)
at jist.runtime.Controller.eventLoop(Controller.java:428)
at jist.runtime.Controller.run(Controller.java:457)
at java.lang.Thread.run(Thread.java:619)

更新:我将范围缩小到引发异常的这一行:

private Method findMain(Class<?> c) throws NoSuchMethodException {
return c.getDeclaredMethod("main", new Class<?>[] { String[].class });
}

类中有一个main方法被传递给这个函数,所以我不知道为什么它返回一个null

更新2:

有一个函数:

createNode(..., ..., ..., ..., MyClient.class, ..., ...)

它将MyClient.class传递给一个函数,该函数在上面发布的findMain方法中使用它。使用调试器,我可以看到 declaredMethodsnull,因此显然 getDeclaredMethods 调用正在消失。 MyClient 类按以下方式定义为内部静态类:

public static class MyClient {
public static void main(String[] args[]) {

...

}
}

我不确定这是否与 declaredMethodsnull 有关,因此我尝试将该类提取到一个单独的类中,但没有成功。

更新3:

好的,缩小范围了。即使在主类中,以下内容也会引发异常:

System.out.println(MyClient.class.getDeclaredMethods());

最佳答案

也许下载 BCEL 的源代码并在该方法的第 135 行放置一个断点

org.apache.bcel.verifier.structurals.OperandStack.pop(OperandStack.java:135)

会告诉你更多。显然,数组索引操作存在问题。

据我所知,BCEL 已不再处于开发阶段,因此如果存在错误,如果您报告它,可能很难修复它。

ASM是一个正在开发的更现代的字节码生成库。您可能已经知道这一点;但是如果您有该模拟器的源代码并且它没有过多使用 BCEL,那么您也许可以使用 ASM 重写它。当然,这样的事情通常是矫枉过正的。

关于java - 堆栈操作时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4310815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com