2011-11-10 10 views
4

저는 Akka Typed Actors을 사용하는 Java 애플리케이션이 있습니다. 코드는 이클립스에 오류가없는,하지만 난 내 응용 프로그램을 시작할 때이 오류 충돌 및 인쇄 : 내가 잘못 될 수 있는지 이해가 안Akka 액터가 실패했습니다. 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 아래

내가이 오류 코드에 대한 예입니다. 나는 이클립스에서 "빌드 경로"에이 항아리 - 파일이 :

  • akka-actor-1.2.jar
  • akka-typed-actor-1.2.jar
  • (만 인 - 메모리 데이터베이스가이 예제에 사용) (JDK7에서)
    • derby.jar
    • aspectwerkz-2.2.3.jar
    • scala-library.jar

    나는 여기 S 코드 :

    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

    나는이 버그 내가 하나의 자바 7 시도 -과 - 자원 문에을 여러 리소스를 사용하는 장소에있는 것을 발견했다.

    예. 이 코드는 버그가있을 것이다 :

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

    및 해결 방법과 같습니다 옵션 -XX와

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

    매개 변수()로 시도한 적이 없다 – ZiglioUK

    1

    실행 자바 : -UseSplitVerifier 바이트 코드는 코드가 발생하는 경우가 발생할 수

    +0

    "OpenJDK 64 비트 서버 VM 경고 : 옵션 UseSplitVerifier를 무시하고 8.0에서 지원이 제거되었습니다" –