NPE в заводной метод при компиляции - PullRequest
3 голосов
/ 31 марта 2011

Я получаю 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 (даже объявление), я получаю NPE, сгенерированный groovy, следующим образом:

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 не равна нулю. Но я не могу понять, что, черт возьми, происходит.

Ответы [ 3 ]

2 голосов
/ 31 марта 2011

Похоже, что if (error) возвращает null; из блока finally в конец метода делает свое дело, но пока не совсем уверен, почему.

2 голосов
/ 01 апреля 2011

проблема не в коде, а в том, как его компилирует groovy, так что лучшее место для проверки - это трекер ошибок http://jira.codehaus.org/browse/GROOVY.
Вы можете найти существующую проблему или создать ее.
вот сокращенный пример, который вызывает ошибку, я не знаю, можно ли ее уменьшить, поскольку я не знаю точную проблему.

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

Я бы сказал, что есть некоторое взаимодействие между вложенными блоками try и этим явным возвратом. также обратите внимание, что этот блок должен быть последним оператором в методе (если он используется как скрипт, как если бы он выбрасывал этот NPE, будучи последним оператором метода run ()).

0 голосов
/ 31 марта 2011

session.close () в блоке finally бросает NPE, поскольку сессия никогда не инициализируется, если ssh.startSession () завершается неудачно. Или я скучаю по ул?

...