2013-11-23 9 views
0

안녕에,자바 - NullPointerException이 ClassNode.accept

나는 ClassNode와 ClassWriter을 적용하려고 할 때마다, 그것은 NullPointerException이 발생합니다. 이 문제를 해결할 수있는 방법이 있습니까?

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; 

} 

은 다른 사람이 어떤 아이디어가 있습니까 : 여기

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

node.accept(writer); 

bytes = writer.toByteArray(); 

전체 방법이다 : 그것은 대해 이야기하고 그 자리 여기

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 

됩니다 : 여기

오류입니다 이 문제를 해결하는 방법?

답변

1

accept()을 호출 할 때 nodenull 인 오류 메시지가 표시됩니다. 그 라인 앞에 어떤 식 으로든 초기화합니까?

+0

전체 메소드 게시물에는 ClassNode node = new ClassNode(); – WinneonSword

+0

@WinneonSword : 전체 메소드에서 OP는 ClassReader 객체가 아닌 ClassNode 객체에서 accept()를 호출하지 않으므로 스택 추적은 해당 메소드에서 벗어날 수 없습니다. – t0mppa