2013-11-23 2 views
0

Здравствуйте,Java - NullPointerException на ClassNode.accept

Всякий раз, когда я пытаюсь принять ClassWriter с ClassNode, она бросает 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; 

} 

Кто-нибудь есть какие-либо идеи о как это исправить?

ответ

1

Сообщение об ошибке предложит, чтобы ваш node был null, когда вы вызываете на него accept(). Вы инициализируете его каким-то образом перед этой линией?

+0

В столбцах полного метода указано, что ClassNode node = new ClassNode(); – WinneonSword

+0

@WinneonSword: В полном методе OP не вызывает 'accept()' на объекте ClassNode, а не на объекте ClassReader', поэтому stacktrace не может быть из этого метода. – t0mppa