- PR -

JSPでHashMapとHashtableの違い

1
投稿者投稿内容
eagle9095
会議室デビュー日: 2008/04/24
投稿数: 4
投稿日時: 2008-04-24 17:18
教えて下さい。
JSPで以下の様にコーディングしたところ、
java.lang.ClassCastException: java.util.Hashtable
が発生します。

HashMapをHashtableにすれば、動作しますが、なぜでしょうか?
環境は、
Tomcat5.5
javac 1.5.0_14
Windows Xp
です。


ArrayList<HashMap<String, String>> stockArray = (ArrayList<HashMap<String, String>>)request.getAttribute("stockDisp");

for (int i = 0 ; i < stockArray.size() ; i++) {
HashMap<String, String> dataHash = stockArray.get(i); // ここがエラー
str = dataHash.get("aaa");
}

宜しくお願い致します。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-04-24 17:36
stockArrayに実際に格納されているオブジェクトがHashtableなのではないでしょうか。
requestにsetAttributeしている側を確認してみてください。

つまるところ
(ArrayList<HashMap<String, String>>)request.getAttribute("stockDisp")
の部分のキャストが安全じゃないんですよね。
eagle9095
会議室デビュー日: 2008/04/24
投稿数: 4
投稿日時: 2008-04-24 17:48
nagiseさん、返答ありがとうございます。
request側は、

ArrayList<HashMap<String, String>> stock = new ArrayList<HashMap<String, String>>() ;
HashMap<String, String> dataHash = new HashMap<String, String>();
dataHash.put("aaa", "1");
stock.add(dataHash);
request.setAttribute("stockDisp", stock);
です。
問題無いと思いますが・・・
いかがでしょうか?
宜しくお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-04-24 18:18
> HashMapをHashtableにすれば、動作しますが、なぜでしょうか?
とありますが、提示のソースはHashMap版、つまりClassCastExceptionが出る版のものですよね?

JSPなのでブレークポイントを張りにくいところですね。
引用:

HashMap<String, String> dataHash = stockArray.get(i); // ここがエラー


の部分で、
コード:
System.out.println(stockArray.get(i).getClass());


などとして、実際の型を見てみるとよいでしょう。
ArrayListの中にHashMapとHashtableが混合して入っているのでしょうか?
それともHashtableのみが入っているのでしょうか?

requestへのset側には特に問題がないように見えますが、
他の場所で上書きなどしていませんよね?

また、WebシステムはJSP含めキャッシュに注意してください。
workフォルダにJSPが変換されて作られるjavaファイルなどがあります。
ソースの編集を行った後は最新のソースから作られたclassファイルが
利用されるようにTomcatを停止させworkをクリーンにして動作確認に臨みましょう。
eagle9095
会議室デビュー日: 2008/04/24
投稿数: 4
投稿日時: 2008-04-24 18:44
nagiseさんありがとうございます。
引用:

> HashMapをHashtableにすれば、動作しますが、なぜでしょうか?
とありますが、提示のソースはHashMap版、つまりClassCastExceptionが出る版のものですよね?


はい、そうです。


引用:

コード:
System.out.println(stockArray.get(i).getClass());


などとして、実際の型を見てみるとよいでしょう。


今度は、この行に
java.lang.ClassCastException: java.util.Hashtable
が発生しました。

引用:

ArrayListの中にHashMapとHashtableが混合して入っているのでしょうか?
それともHashtableのみが入っているのでしょうか?


HashMapのみです。

引用:

requestへのset側には特に問題がないように見えますが、
他の場所で上書きなどしていませんよね?


はい、上書きはしていません。

引用:

また、WebシステムはJSP含めキャッシュに注意してください。
workフォルダにJSPが変換されて作られるjavaファイルなどがあります。
ソースの編集を行った後は最新のソースから作られたclassファイルが
利用されるようにTomcatを停止させworkをクリーンにして動作確認に臨みましょう。


eclipseで開発しております。
プロジェクトをクリーンしてから実行させても同じですね。
宜しくお願いします。

ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-04-24 19:44
そのJSPは、どっかからforwardされてるわけ?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-04-24 21:01
引用:

eagle9095さんの書き込み (2008-04-24 18:44) より:
今度は、この行に
java.lang.ClassCastException: java.util.Hashtable
が発生しました。


となると、動いているJSPの実体が別物の可能性が高いですね。

引用:

また、WebシステムはJSP含めキャッシュに注意してください。
workフォルダにJSPが変換されて作られるjavaファイルなどがあります。
ソースの編集を行った後は最新のソースから作られたclassファイルが
利用されるようにTomcatを停止させworkをクリーンにして動作確認に臨みましょう。



の部分を試してみてください。
Eclipseのクリーンで行われるのは、WEB-INF/classes以下のクリーニングだけです。
JSPはTomcatが実行時にServletに変換し、classファイルにするため
Eclipseのクリーンではゴミが残っていることがあります。
eagle9095
会議室デビュー日: 2008/04/24
投稿数: 4
投稿日時: 2008-04-28 18:03
rancoさん、nagiseさん返信が遅くなって申し訳ありません。

引用:

そのJSPは、どっかからforwardされてるわけ?


strutsの1.2.9を使用しています。



引用:

また、WebシステムはJSP含めキャッシュに注意してください。
workフォルダにJSPが変換されて作られるjavaファイルなどがあります。
ソースの編集を行った後は最新のソースから作られたclassファイルが
利用されるようにTomcatを停止させworkをクリーンにして動作確認に臨みましょう。


上記の通りやってみましたが、結果は同じでした。
宜しくお願いします
1

スキルアップ/キャリアアップ(JOB@IT)