0

私はこれがArrayListに要素を追加する私のコードです

if(countries==null){
  countries = new ArrayList();
  for(int x = 0; x < data.getRowCount(); x++)
  {
      String shortName = data.getString(x,0);
      String code = data.getString(x,1);
      countries.add(x, new Country(code, shortName));
  }
}

そして、以下はイテレータコードです

for( Iterator iter = countries.iterator(); iter.hasNext();)
{
   Country country = (Country)iter.next();
   Element optionselect = doc.createElement( "countryselect" );
   optionselect.setAttribute( "name", country.getShortName() );//Getting NULL Pointer Exception
   optionselect.setAttribute( "value", country.getCode() );
   countriesElement.appendChild( optionselect );
}

今、次の行でヌルポインタ例外が発生しています:

optionselect.setAttribute( "name", country.getShortName() );

PS:本番環境で実行されているためデバッグできず、ローカルサーバーで複製できません

一見すると、ArrayList に値 null があるように見えますが、コードからはそれがどのように可能であるかわかりません。

誰かがそれに光を当てることができますか(Java 5のバグかもしれません)。

編集:このコードでヌルポインターも取得しています

List countryCodes = new ArrayList();
for (int x = 0; x < countries.size(); x++)
{
    Country c = (Country) countries.get(x);
    countryCodes.add(x, c.getCode());// Throwing Exception
}

これは、 にどこかnullにオブジェクトがあることを確認しますcountries Listが、コードを見ると、それがどのように可能かわかりません

スタック トレースは次のとおりです。

Stack Trace:java.lang.NullPointerException
    at com.ilrn.controller.modules.Users.appendCountryList(Users.java:985)
    at com.ilrn.controller.modules.Users.setupCountries(Users.java:1348)
    at com.ilrn.controller.modules.Users.gen_add(Users.java:1329)
    at com.ilrn.controller.modules.Users.generate(Users.java:190)
    at com.ilrn.controller.ShellModule.generateShell(ShellModule.java:1958)

Users.java:985 はoptionselect.setAttribute( "name", country.getShortName() );

Stack Trace(number 2):java.lang.NullPointerException
    at com.ilrn.controller.dto.IlrnCountriesDTO.getCountryCodes(IlrnCountriesDTO.java:45)
    at sun.reflect.GeneratedMethodAccessor471.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)

IlrnCountriesDTO.java:45 の場所countryCodes.add(x, c.getCode());

また、国リストは 1 回だけ読み込まれることに注意してください (初めて要求され、国が非公開の場合)。

分析した結果、これはマルチスレッドの問題だと思います。ArrayList コードを見た後、synchronizedそうではないことがわかりました(同じインデックスに対してサイズが2回インクリメントされた可能性があります)

 public void add(int index, E element) {
    if (index > size || index < 0)
      throw new IndexOutOfBoundsException(
      "Index: "+index+", Size: "+size);
  ensureCapacity(size+1);  // Increments modCount!!
  System.arraycopy(elementData, index, elementData, index + 1,
         size - index);
  elementData[index] = element;
  size++;
 }

これは国のクラスです(スニペット)

private String code_;
private String shortName_;

/**
 * Constructor sets code and short name.
 * 
 * @param code Specifies the code.
 * @param shortName Specifies the short name.
 */
public Country(String code, String shortName)
{
    code_ = code;
    shortName_ = shortName;
}
public String getCode() {
        return code_;
}

public String getShortName() {
        return shortName_;
}
4

1 に答える 1

1

あなたの追加コードは少しずれているように見えます...あなたは持っています

if (countries != null){
    countries = new ArrayList();
    ...

しかし、そうではありません:

if (countries == null){
    countries = new ArrayList();

通常、何かが null の場合は初期化します。それ以外の場合は、既に存在していたものをすべて吹き飛ばしてしまいます。

于 2012-11-16T07:29:50.070 に答える