编译时groovy方法中的NPE

编译时groovy方法中的NPE,groovy,try-catch,nullpointerexception,Groovy,Try Catch,Nullpointerexception,我以一种奇怪的方式得到了NPE。接下来是方法调用,因为它正在发生: String exec(String command) { if (command == null || isConnected()) return null; Session session = null; boolean error = false; try { session = ssh.startSession(); //

我以一种奇怪的方式得到了NPE。接下来是方法调用,因为它正在发生:

    String exec(String command) {
        if (command == null || isConnected()) return null;

        Session session = null;
        boolean error = false;
        try {
            session = ssh.startSession();
//           try {
//                final Session.Command cmd = session.exec(command);
//                String result = cmd.getOutputAsString();
//                if (cmd.getExitStatus() != null && cmd.getExitStatus() != 0){
//                    //TODO:command execution failure should be logged
//                    error = true;
//                } else {
//                    return result;
//                }

//            } catch (Exception ex){
//                //TODO:command execution failure should be logged
//                ex.printStackTrace();
//                error = true;
//            }
        } catch (Exception ex) {
            // TODO:session creation failure should be logged
            ex.printStackTrace();
            error = true;
        } finally {
            session.close();
            if (error) return null;
        }
    }
如果我取消对内部try/catch块的注释(仅限偶数声明),我将得到groovy生成的NPE,如下所示:

java.lang.NullPointerException
    at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
    at org.objectweb.asm.MethodAdapter.visitMaxs(Unknown Source)
    at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:605)
    at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:123)
    at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:696)
    at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1039)
    at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:50)
    at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:276)
    at org.codehaus.groovy.control.CompilationUnit$12.call(CompilationUnit.java:748)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:942)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:519)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:497)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:474)
    at org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper.compile(GroovyCompilerWrapper.java:43)
    at org.jetbrains.groovy.compiler.rt.GroovycRunner.main(GroovycRunner.java:128)
    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 com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:75)

代码没有什么特别之处,ssh变量不为null。但是我不知道到底发生了什么。

finally块中的session.close()抛出一个NPE,因为如果ssh.startSession()失败,会话永远不会初始化。或者我是否缺少st?

它看起来像是将if(error)返回null;从最后块进入方法端会起作用,但还不完全确定原因。

问题不在代码中,而是在groovy编译它的方式中,因此最好的检查位置是他们的bug跟踪器。
您可以查找现有问题或创建一个问题。
这里有一个触发错误的简化示例,我不知道是否可以将其缩小,因为我不知道确切的问题

try {
  try {} catch (e) {}
} finally {
  return anything
}

我想说嵌套的
try
块和显式返回之间有一些交互。还请注意,此块必须是该方法中的最后一条语句(如果用作脚本,它将抛出该NPE,这是run()方法的最后一条语句)。

您使用的Groovy版本是什么?您使用的是哪个SSH库?@Emil,1.7.10@tim_yates,请不要试图得到你实际上不需要的东西。什么,你的问题的一个有效例子?你是对的,我道歉。如果你能展示一个例子,让我们重现问题(例如,通过将代码复制到Groovy控制台),你就更有可能得到解决方案。是的,这不是问题所在。(这意味着它是潜在的问题,但不适合特定的代码)请参阅我的答案。