2012-01-18 27 views
1

我正在嘗試將一個簡單的PE添加到我的應用程序中。該PE擴展AbstractPE和覆蓋輸出方法(什麼都不做) 我也修改了XML文件,添加一個bean,像以下:S4啓動PE時數組索引超出界限

<bean id="rogerpe" class="cnu.roger.FPActor.RogerPE">                                  
     <property name="keys">                                         
       <list>                                           
         <value>RawTransaction *</value>                                  
       </list>                                          
     </property>                                           
    </bean> 

但是,當我試圖運行平臺。發生一些異常。

Caused by: org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [cnu.roger.FPActor.RogerPE]: 
Constructor threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: -1 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877) 
    ... 16 more 
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:338) 
    at java.util.ArrayList.get(ArrayList.java:351) 
    at io.s4.processor.OverloadDispatcherGenerator.generate(OverloadDispatcherGenerator.java:209) 
    at io.s4.processor.AbstractPE.<init>(AbstractPE.java:126) 
    at cnu.roger.FPActor.RogerPE.<init>(RogerPE.java:22) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100) 
    ... 18 more 

該PE的代碼:

package cnu.roger.FPActor;                                          

import java.util.Collections;                                         
import java.util.List;                                           

import io.s4.processor.AbstractPE;                                        

class RogerPE extends AbstractPE                                        
{                                                
     @Override                                            
     public void output()                                         
     {                                              
       // TODO Auto-generated method stub                                    

     }                                              
} 

我現在困惑。我不知道它意味着哪個數組。 任何幫助表示讚賞!

在OverloadDispatcherGenerator.java

InstructionHandle returnInstruction = il.append(InstructionFactory.createReturn(Type.VOID));                       

for (int i = 0; i < targetInstructions.size(); i++) {                                 
    branchInstructions.get(i).setTarget(targetInstructions.get(i));                             
}                                              

branchInstructions.get(branchInstructions.size() - 1)                                 
        .setTarget(returnInstruction);                                  

for (BranchInstruction gotoInstruction : gotoInstructions) {                               
    gotoInstruction.setTarget(returnInstruction);                                  

} 

的209線是:branchInstructions.get ....

+2

向我們展示'RogerPE'的代碼,一個答案肯定會跟着:-) – millhouse 2012-01-18 01:55:48

+0

代碼被添加,thx。 – Qinghao 2012-01-18 02:39:43

+0

即使沒有構造函數,這個異常仍然會發生。 – Qinghao 2012-01-18 02:41:05

回答

0

我認爲錯誤代碼是:

branchInstructions.get(branchInstructions.size() - 1)                                 
       .setTarget(returnInstruction); 

如果branchInstructions.size()== 0,則branchInstructions.size() - 1得-1,-1卻是無效的指標。

+0

這真的有效!謝謝! – Qinghao 2012-01-18 04:12:56

+0

但我不知道這可能是什麼原因。我希望它能很好地工作。 :-) – Qinghao 2012-01-18 04:13:39

+0

別擔心,if語句沒有副作用。 – Alanmars 2012-01-18 05:05:03

0

首先第一件事情,你需要讓你的調用super()構造第一

否則,您正在處理尚未完全初始化的對象。這可能會解決您的問題。

其次,爲什麼要創建一個空的List<String>並轉換它,如果你真的想要的只是一個空的String數組?

String[] sa = new String[0]; 
+0

但我刪除了所有的構造函數。這個例外依然存在。 – Qinghao 2012-01-18 02:55:45

+0

我不認爲這是關鍵。堆棧顯示當超級方法被調用時發生異常。這就是爲什麼我把它放在後面。 – Qinghao 2012-01-18 02:56:03

+0

我刪除了整個構造函數,這個異常仍然發生。 :-) – Qinghao 2012-01-18 03:09:42