私はこれが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_;
}