2011-11-10 23 views
4

我有一個Java應用程序,我使用Akka Typed Actors。該代碼在Eclipse中沒有錯誤,但是當我開始我的應用程序崩潰並打印此錯誤:Akka Actors失敗,VerifyError:分支目標處的堆棧映射幀不一致

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(),但沒有錯誤。什麼可能是錯的?


UPDATE

下面是例如在代碼在那裏我得到這個錯誤。 我在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(); 
    } 
} 
+0

時生成的字節碼的代碼是可能發生這種情況構建不正確。我會嘗試早期版本(或更高版本) –

+0

@Peter:之前我有一個早期版本,但我得到了同樣的錯誤,但使用了不同的方法。 – Jonas

+0

Akka <2.0中的TypedActors使用AspektWerkz字節碼編織,我不知道什麼可能會導致您的問題,但如果您可以最小化問題並提交一張票,有人可以看看它。 –

回答

4

我已經發現這個錯誤是在我在一個Java 7 試穿與資源語句中使用多個資源地方。

E.g.這個代碼將有錯誤:

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(); 
} 
+0

我從來沒有見過嘗試使用參數() – ZiglioUK

1

運行Java的選項-XX:-UseSplitVerifier

+0

「OpenJDK 64位服務器VM警告:忽略選項UseSplitVerifier;支持已在8.0中刪除」 –