java - ClassNode.accept 上的 NullPointerException

标签 java class java-bytecode-asm minecraft-forge

你好,

每当我尝试接受带有 ClassNode 的 ClassWriter 时,它都会抛出 NullPointerException。我有办法解决这个问题吗?

这是错误:

Caused by: java.lang.NullPointerException
    at org.objectweb.asm.tree.ClassNode.accept(ClassNode.java:340)
    at net.winneonsword.WCClient.asm.WCClassTransformer.transform(WCClassTransformer.java:119)
    at net.winneonsword.WCClient.asm.WCClassTransformer.transform(WCClassTransformer.java:64)
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:274)
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:172)
    ... 9 more

这里是它正在谈论的地方:

ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

node.accept(writer);

bytes = writer.toByteArray();

完整方法如下:

private byte[] transform(PatchInfo patch, byte[] z){

    boolean patched = false;
    byte[] bytes = z;

    ClassNode node = new ClassNode();
    ClassReader reader = new ClassReader(bytes);

    reader.accept(node, 0);

    WCLog.fine("Patching Class: %s", new Object[] { patch.target });

    HashMap<MethodNode, MethodNode> replace = new HashMap();

    for (MethodNode target : node.methods){

        for (MethodInfo method : patch.methods){

            if ((method.name.equals(method.name) || method.name.equals(method.mappedName))
                    && (method.desc.equals(method.desc) || method.desc.equals(method.mappedDesc))){

                MethodNode replacement = this.getReplacementMethod(patch, method);

                replace.put(target, replacement);
                WCLog.fine("Successfully Patched: %s at %s", new Object[] { method.name, method.desc });

                patched = true;

            }

        }

    }

    if (patched){

        for (MethodNode method : replace.keySet()){

            MethodNode replacement = replace.get(method);

            node.methods.remove(method);
            node.methods.add(replacement);

        }

        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

        node.accept(writer);

        bytes = writer.toByteArray();

    }

    return bytes;

}

有人知道如何解决这个问题吗?

最佳答案

当您在其上调用accept() 时,错误消息会表明您的节点null。您是否在该行之前以某种方式初始化它?

关于java - ClassNode.accept 上的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20169429/

相关文章:

java - 使用特定的类加载器从 `` byte[ ]`` 加载类

java - 如何从我在运行时使用 ASM 动态创建的 Java 类中获取和使用类类型?

java - 尝试在 android studio 中运行 java 程序时出现错误 :Execution failed for task ':app:preDebugAndroidTestBuild' ,

java - 如何使用ant build.xml将源代码添加到jar文件

javascript - 如果 JavaScript 中有一个类名称字符串,如何访问该类?

c++ - 我的预增量工作正常,但后增量不行

java - 使用 Java 在 EPS 文件中添加元数据

java - 如何在 Java 中返回 TreeSet 中的第 k 个元素?

javascript - 我如何将 CSS 属性作为 Javascript 赋予克隆元素?

java - 在 ASM 字节码中打印一个方法