Akka Actors失败,VerifyError:分支目标的堆栈映射帧不一致



我有一个使用Akka Typed Actors的Java应用程序。该代码在Eclipse中没有错误,但是当我启动应用程序时,它崩溃并打印以下错误:

Exception in thread "main" java.lang.VerifyError: Inconsistent stackmap frames at branch target 266 in method com.example.actors.DBActor.getItems(Lorg/joda/time/DateTime;Lorg/joda/time/DateTime;)I at offset 170
    at com.example.ui.Main$1.create(Main.java:31)
    at akka.actor.TypedActor$$anonfun$newInstance$3.apply(TypedActor.scala:677)
    at akka.actor.TypedActor$$anonfun$newInstance$3.apply(TypedActor.scala:677)
    at akka.actor.TypedActor$.newTypedActor(TypedActor.scala:847)
    at akka.actor.TypedActor$$anonfun$newInstance$1.apply(TypedActor.scala:601)
    at akka.actor.TypedActor$$anonfun$newInstance$1.apply(TypedActor.scala:601)
    at akka.actor.LocalActorRef.akka$actor$LocalActorRef$$newActor(ActorRef.scala:1084)
    at akka.actor.LocalActorRef$$anonfun$2.apply(ActorRef.scala:628)
    at akka.actor.LocalActorRef$$anonfun$2.apply(ActorRef.scala:628)
    at akka.util.ReentrantGuard.withGuard(LockUtil.scala:20)
    at akka.actor.LocalActorRef.<init>(ActorRef.scala:628)
    at akka.actor.Actor$.actorOf(Actor.scala:249)
    at akka.actor.TypedActor$.newInstance(TypedActor.scala:677)
    at akka.actor.TypedActor.newInstance(TypedActor.scala)
    at com.example.ui.Main.main(Main.java:29)

我不明白哪里出错了。我检查了我的com.example.actors.DBActor.getItems(),没有错误。会出什么问题呢?


下面是我得到这个错误的代码示例。我在Eclipse的"构建路径"上有这些jar文件:

  • derby.jar(来自JDK7)(本例中仅使用内存中的数据库)
  • akka-actor-1.2.jar
  • akka-typed-actor-1.2.jar
  • aspectwerkz-2.2.3.jar
  • scala-library.jar

代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import akka.actor.TypedActor;
import akka.actor.TypedActorFactory;

public class App {
    public App() {
        TypedActor.newInstance(Backend.class, new TypedActorFactory() {
            public TypedActor create() {
                return new DataActor();
            }
        });
    }
    class DataActor extends TypedActor implements Backend {
        @Override
        public void insertData(String msg) {
            final String sqlSelect = "SELECT msg FROM SESSION.messages "+
                                     "WHERE to_user_id = ? AND from_user_id = ?";
            final String connectionURL = "jdbc:derby:memory:memdatabase;create=true";
            /* if this declaration is moved to where the string is used 
               in the conditional, the conditional can be used */
            String result;
            try(Connection conn = DriverManager.getConnection(connectionURL);) {
                try(PreparedStatement ps = conn.prepareStatement(sqlSelect);
                    ResultSet rs = new QueryHelper(ps)
                                    .integer(13).integer(26).executeQuery();) {
                    /* this doesn't work */
                    result = (rs.next()) ? rs.getString("text")
                                         : null;
                    /* but this work:
                     String result = (rs.next()) ? rs.getString("text")
                                                 : null;
                     */
                    /* this works fine 
                    while(rs.next()) {
                        result = rs.getString("msg");
                    }                                   */
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    class QueryHelper {
        private final PreparedStatement ps;
        private int index = 1;
        public QueryHelper(PreparedStatement ps) {
            this.ps = ps;
        }
        public QueryHelper integer(int param) throws SQLException {
            ps.setInt(index++, param);
            return this;
        }
        public ResultSet executeQuery() throws SQLException {
            return ps.executeQuery();
        }
    }
    public interface Backend {
        public void insertData(String text);
    }
    public static void main(String[] args) {
        new App();
    }
}

我发现这个bug是在我在一个Java 7 try-with-resources语句中使用多个资源的地方。

。下面的代码有如下错误:

try (Connection conn = DriverManager.getConnection(connURL);
     PreparedStatement ps = conn.prepareStatement(sql);) {
    // do something
} catch (SQLException e) {
    e.printStackTrace();
}

和一个解决方案看起来像:

try (Connection conn = DriverManager.getConnection(connURL);) {
    try (PreparedStatement ps = conn.prepareStatement(sql);) {
        // do something
    }
} catch (SQLException e) {
    e.printStackTrace();
}

使用-XX:-UseSplitVerifier选项运行java

最新更新