2012-01-18 5 views
1

私は今、単純なPEを私のアプリケーションに追加しようとしています。このPEはAbstractPEを拡張し、出力メソッドをオーバーライドします(何もしない) 私も次のように、豆を追加し、xmlファイルを改訂:。アレイインデックス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                                    

     }                                              
} 

私は今、混乱しています。どのアレイが意味するのか分かりません。 ご協力いただければ幸いです!

209行がある

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);                                  

} 

OverloadDispatcherGenerator.javaで:branchInstructions.get ....

+2

私たちに 'RogerPE'のコードを見せてください。答えは必ず – millhouse

+0

コードが追加されています。 – Qinghao

+0

コンストラクタがなくても、この例外が発生します。 – Qinghao

答えて

0

私は、エラーコードがあると思う:

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

branchInstructions.size()== 0、その後、branchInstructions.size()の場合 - -1を得る1が、-1無効なインデックスであります。

+0

これは本当にうまくいった!ありがとう! – Qinghao

+0

しかし、このif文が何を引き起こすのか分かりません。それがうまくいくことを願っています。 :-) – Qinghao

+0

心配はいりませんが、if文には副作用がありません。 – Alanmars

0

まず、物事はまず、あなたは最初super()コンストラクタにあなたの呼び出しを行う必要があります。

それ以外の場合は、完全に初期化されていないオブジェクトで作業しています。これはおそらくあなたの問題を解決するでしょう。

第2に、空のList<String>を作成し、本当に必要なものが空の文字列配列の場合は、それを変換するのはなぜですか?

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

しかし、私はすべてのコンストラクタを削除した後。この例外はまだ存在します。 – Qinghao

+0

私はそれが鍵だとは思わない。スタックは、スーパーメソッドが呼び出されたときに例外が発生することを示しています。それが私が後者にした理由です。 – Qinghao

+0

コンストラクタ全体を削除しましたが、この例外は引き続き発生します。 :-) – Qinghao