• ベストアンサー

HashMapについて

【Java-Class】 JavaでDBの終了まで、日付・DB有無フラグを退避する。 【JSP】 DB有無フラグが存在する場合は"・"をカレンダーに表示する。 という処理を行いたいと思います。 HashMapを使用して put(),get()を使用したいと思いますが、get()を実行した際にNullPointerExceptionが表示されてしまいます。 エラーを見る限りではputの際に配列に設定していないのが原因なのではないかと思いますが、 修正方法がよくわかりません。 どうかよろしくお願いします。 ===DBSelect.java================================= CalenderHash hash = new CalenderHash(); /* DB終了まで */ while(rs.next()){ // 値の格納 hash.HashPut(rs.getString(YMD), "1"); } ===CalenderHash.java============================= public class CalenderHash { protected HashMap ht; public CalenderHash(){ } public void HashPut(Object YMD,Object Flg){ ht.put(YMD,Flg); } public Object get( Object key ) { return(ht.get(key)); } ==JSPの一部 ============================ for ( int i=1; i<=6; i++){ out.println("<TR ALIGN='right'>"); out.println("<TD>"); <省略> YearMD = year + month + Day; mark = ""; // 値の取得 if ( hash.get(YearMD).equals("1")){ mark = "・"; } %> <A HREF="/Schedule/jsp/memo.jsp?Ymd=<%= YearMD %> "><%= mark %><%= cntday %></A> &nbsp; <% } out.println("</TD>"); } out.println("</TR>"); }

  • Java
  • 回答数13
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

JAVAとJSPとの受け渡しは、どのようになってますか? 多分そこがおかしいかと・・・。 普通に渡せていれば、JSP側で単純にgetするだけです。

-cinq-
質問者

補足

やはりそうですか。 現在は受け渡しを行ってないです。 PutしたデータをJSP側に渡すには 具体的にはどのように設定するのですか? ===== Servlet ====== <省略> request.setAttribute("year", year); request.setAttribute("month", month); String YMD = year + month + "01"; /* カレンダー処理 */ Dbconnect connect = new Dbconnect(); Calendar calen = Calendar.getInstance(); calen.set(Integer.parseInt(year),Integer.parseInt(month) - 1,1); maxday = Integer.toString(calen.getActualMaximum(Calendar.DATE)); maxday = year + month + maxday; connect.chkShedule(YMD,maxday); request.getRequestDispatcher("/jsp/calender.jsp").forward(request,response); } ===== Java ====== public void chkShedule(String YMD,String maxday){ /*HashMapクラスの生成 */ CalenderHash hash = new CalenderHash(); <省略> /* DB終了まで */ while(rs.next()){ // 値の格納 hash.HashPut(rs.getString("YMD"), "1"); } <省略> }

その他の回答 (12)

回答No.13

>>型の不一致: String から CalenderHash には変換できません。 ん??? CalenderHash hash = (CalenderHash)request.getParameter("hash"); かな? CalenderHash hash = (CalenderHash)request.getAttribute("hash"); かも・・・。 ちゃんとソース見てないので、ちょっと自信ないです・・・。

-cinq-
質問者

お礼

ありがとうございますっ!! やっと表示できました。 キャッシュもしてみましたが、 キャッシュできませんのエラーが表示されました。 で、よく考えてみたところ jsp:useBeanで定義してうまくいきました。 本当に長い間ありがとうございました。

回答No.12

>型の不一致: String から CalenderHash には変換できません。 そのままでしょう。 コンパイルエラーなんだから行数出てますよね。 そこでStringをCalenderHashの変数に入れようとしていませんか? #っていうことより、1番言いたいのは #×CalenderHash #○CalendarHash #ってことです。 #勉強用なら構いませんが、仕事などで世に出すと…

回答No.11

補足のメールがうまく届かないので、回答が遅れてしまった・・・。 >>(1)は戻り値が存在しませんが、request.setAttribute("キー名", hash);で値は渡せるのですか? #10で回答しましたので、参考にしてください。 >>また、JSP側の受け取りは・・・以下略 CalenderHashです。 ちなみに、 >>○○○○ hash = request.getParameter("hash"); ○○○○ hash = request.getParameter("キー名"); ですよ。

-cinq-
質問者

補足

ご回答ありがとうございます。 >>○○○○ hash = request.getParameter("キー名"); ですよ。 説明不足でごめんなさい。 キー名を"hash"とした時という説明が抜けておりました。 CalenderHashでコンパイルを行ってみたのですが 型の不一致: String から CalenderHash には変換できません。 のエラーが表示されてしまいます。 何度も申し訳ありません。

回答No.10

あっ、そうそう・・・。 値が入ったCalenderHashのインスタンスが、 chkSheduleメソッドの中で生成されてるんですね・・・。 とりあえずこいつをreturnするか(voidをやめる)、引数で戻してこないと・・・。 クラス設計見直しかな?

回答No.9

あれ? 値の入ったCalenderHashのインスタンス(ここではhash)はどこ行ったの??? request.setAttribute("キー名", hash); がない!!!

-cinq-
質問者

補足

当初の原因がここにあるようです。 遠回りをさせてしまいまして申し訳ありません。 まだいまだに明確に出来ていない点があるのですが よろしければご教授いただけませんでしょうか? JSP側に値を渡さないといけないのは、 わかるのですが。。。 Servletの中では以下の処理をしています。 (1)connect.chkShedule(YMD,maxday); (2)request.getRequestDispatcher("/jsp/calender.jsp").forward(request,response); (1)の中で、HashMapにPutしている。 (2)でJSPに処理を渡す。 (1)は戻り値が存在しませんが、request.setAttribute("キー名", hash);で値は渡せるのですか? また、JSP側の受け取りは  ○○○○ hash = request.getParameter("hash"); ○部分はどのようになるのでしょうか?

回答No.8

>request.setAttribute("year", year); ↑と同じですよ。 >request.getRequestDispatcher("/jsp/calender.jsp").forward(request,response); ↑をやる前に、 >connect.chkShedule(YMD,maxday); ↑で使われた CalendarHashを同じように何か名前をつけてセットして、JSP側で同じ名前でgetしてあげればいいんです。

  • T0ngT0ng
  • ベストアンサー率40% (8/20)
回答No.6

#5です だめですか。。。 じゃ、もう一点だけ気になる点。 DBから採ってきた値をそのままHashのキーにしてますが、それは取得するときに作成するキー YearMD = year + month + Day; と同じ文字列ですか? 入れるところ、出すところあたりでキー値を確認されてみてはいかがでしょう。 (あと、出力するあたりでHashのサイズも確認したほうが良いかな?)

  • T0ngT0ng
  • ベストアンサー率40% (8/20)
回答No.5

NullPointerExceptionがでるのは以下の箇所ですよね? -- // 値の取得 if ( hash.get(YearMD).equals("1")){ -- Hashには、DBから取れた日付分だけputしてるのですから、当然該当しない("・"をつけない)日付ではhash.get(YearMD)はnullとなると思います。 equals("1")ではなく、null かどうかで判断されてはいかがですか?

-cinq-
質問者

補足

ご指摘ありがとうございます。 NullPointerExceptionはご指摘の通り DBに存在しない場合にNullになるので 以下のように修正しました。 // 値の取得 if (hash.get(YearMD) != null){  if ( hash.get(YearMD).equals("1")){     mark = "・";  } } putでは"1"しかセットしていないので入れ子のif文は 不要かとは思いますが。。。 しかしDBに入っている値もNullになっているのが 今の現状です。

回答No.4

#1です。 hash.HashPut(rs.getString(YMD), "1"); このコンパイルで、YMDは解決済みなんですよね? じゃなければ、 hash.HashPut(rs.getString("YMD"), "1"); が正解。 YMDが定義済みなら・・・、 わかりません。 *がダメとも思えないし・・・。

-cinq-
質問者

補足

ありがとうございます。 ご指摘の通りでした。 混乱してきてしまったので、もう少しご教授頂けたらと 幸いです。 JavaからJSPにデータを渡す際は、 request.getRequestDispatcher等を使用しますが 私の記述では関連が取れてないような気がします。 その為、put後にgetができてJSP側では出来ないのかと。。。お門違いであればご指摘ください。 Servlet処理 ・DBConnectクラスへ(HashMapをPut) ・JSPへ(HashMapをGet)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

>その後、列名が無効ですと表示されています だったら、データベースのテーブルに列が無いのでしょう。 hash.HashPut(rs.getString(YMD), "1"); は、 hash.HashPut(rs.getString("YMD"), "1"); の間違いじゃないんですか?

-cinq-
質問者

補足

ありがとうございます。 ご指摘の通りです。 ご指摘分を修正し、試しにwhile文の中でgetしてみたら値がとれました。 しかし,JSP側でのget処理は取得時にnullになっているので もう少し調査をしてみます。

関連するQ&A

  • HashMapについて

    java初心者です。 HashMap oya= new HashMap(); HashMap child=null; child = new HashMap(); child.put("test1",Object1); child.put("test2",Object2); oya.put("Oya1",child); child = new HashMap(); child.put("test3",Object3); child.put("test4",Object4); child = new HashMap(); oya.put("Oya2",child); 上記のように値をセットした状態で ループの中でtest1の値を比較したいのです。 たとえば下記みたいに下記のやり方では出来なのは分かっています 値の比較の仕方を教えてください。 for(int i=0;oya.size();i++){ if(test1.equals("aaaa")){ bbb = "kkk"; break; } } よろしくお願いします。

    • ベストアンサー
    • Java
  • hashMap.getについて

    たびたび、ご質問させて頂きます。 申し訳ありません。 hashMap.getについてなんですが 以下のようにhashMapを設定しました。 --------------------- public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } ・ ・ ・ Key = oStringTokenizer.nextToken(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); hashMap.put(Key,oMyData); ----------------- データを取り出したいので、(inputKey)=入力キー --------------- String[] value = (String[]) hashMap.get(inputKey); System.out.println("日付:" + value[1] + " 名前:" + value[2]); --------------- と、したんですが、エラーは出ないもののSystem.out.printlnの箇所でなにも表示されません。 たびたび、ご質問させて頂いて本当に申し訳ありませんが、ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • ArrayList内HashMapの取得

    基本的で申し訳ないのですが一番下の行で リストの3つめの要素内のkey=key2でyeahをコンソールに出力したいです。 どのように取得すればいいのでしょうか? list.get(2).get("key2")っぽいかんじで... ArrayList list = new ArrayList(); for (int i = 0; i < 5; i++) { HashMap map = new HashMap(); map.put("key1", "hello"); map.put("key2", "yeah"); map.put("key3", "boo"); list.add(map); } System.out.println(list.get(2));

    • ベストアンサー
    • Java
  • HashMapについて

    質問させてください 以下に簡単なコードをJBuilderで作成しました。 printでブレークをはってmapインスタンスを評価してみると、mapに20個のキーが登録されるはずが、 16個しかいません。 この時点でstr1[16]が評価しても表示されていないのですが、map.get()で正常に取得はできています。 どのようなことが考えられるか、わかる型がいましたら教えてください。よろしくお願いいたします。 import java.util.*; class Test { public static void main(String[]args){ HashMap map = new HashMap(); String str1[] = new String[20]; String str2[] = new String[20]; for(int i = 0; i < 20; i ++){ str1[i] = new String(Integer.toString(i)); str2[i] = new String(Integer.toString(i * 10)); map.put(str1[i],str2[i]); } System.out.println("デバック用ブレーク"); System.out.println(map.get(str1[11])); } }

    • ベストアンサー
    • Java
  • HashMap.putについて

    ご質問させて頂きます。 hashMap.putの使い方が良く分かりません。 例えば、以下のようなkudamono.csvファイルがあるとします。 ------------------- A,2003/01/01,スイカ B,2003/02/01,バナナ C,2003/03/01,メロン D,2003/04/01,イチゴ ------------------- このデータをhashMap.putでセットしたいので 以下のようなクラスにしたんですが コンパイルエラーが出てしまいます。 ------------------- /*HashMap生成(クラス変数)*/ public static HashMap hashMap = new HashMap(); public static void main(String args[]) throws Exception { FileReader filereader = new FileReader("kudamono.csv"); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 1; int j = 0; while((line = bufferedreader.readLine()) != null) { System.out.println("Start line at " + i); StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { HashMap.put(stringTokenizerTest.nextToken().toString()); j++; } i++; } filereader.close(); } } --------------- たぶんHashMap.putをする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • javaの連想配列について教えてください

    お世話になります。 javaの連想配列について教えてください。 やりたいことは下記のようなデータを作成したいです。 ================================================ {   "shcool" : {          "class" : "A",          "yamada" : {                "class" : "AA",                "height" : 165,                "weight" : 60         },          "saitou" : {                "class" : "AB",                "height" : 170,                "weight" : 65         }   } } ================================================ 下記HPを参考してHashMap+HashMapで作成したのですがうまくいきません。 http://www.atmarkit.co.jp/fjava/javatips/081java010.html Map<String, Object> map = new HashMap<String, Object>(); map.put("school", new HashMap<String, Object>()); ((Map) map.get("school")).put("class", "A"); ((Map) map.get("school")).put("yamada", new HashMap<String, Object>()); ((Map) map.get("school")).get("yamada").put("class", "AB"); ・・・ としても下記エラーとなってしまいます。 ----------------------------------------------------- エラー: シンボルを見つけられません ((Map) map.get("school")).get("yamada").put("class", "AB");                            ^ シンボル: メソッド put(String,String) ----------------------------------------------------- 途中のschoolのvalueにHashMapを入れるところまではうまくいっているようですが、 yamadaのvalueにHashMapを入れて.put()の仕方がわかりません。。。 上記データをHashMap+HashMapで作成するにはどうしたらよいでしょうか? ぜひご教示いただけると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ArrayListとHashMapを利用する問題について

    『問題』 (1)ArrayListのオブジェクトを生成する。 (2)「何回入力しますか?」と出力し、入力処理を行う。 (3)(2)で入力された回数分、以下の処理を行う。   1)HashMapのオブジェクトを生成する。   2)「名前を入力して下さい。」と出力し、入力処理を行う。 3)「性別を入力して下さい。」と出力し、入力処理を行う。   4)「性別を入力して下さい。」と出力し、入力処理を行う。 5) 1)で作成したHashMapに、それぞれ入力された 名前・年齢・性別を設定する。   6)値を設定したHashMapを(1)で作成したArrayListへ格納する。 (4)ArrayListの件数分、以下の処理を行う。   1)ArrayListより、HashMapを取得する。   2)取得したHashMapより、それぞれ設定されている 名前・年齢・性別を取得する。   3)HashMapより取得した名前・年齢・性別を出力する。 『実行結果』 何回入力しますか? 2 名前を入力して下さい。 iwata 年齢を入力して下さい。 27 性別を入力して下さい。 men 名前を入力して下さい。 hana 年齢を入力して下さい。 21 性別を入力して下さい。 women 名前=iwata 年齢=27 性別=men 名前=hana 年齢=21 性別=women 上記のようなプログラムを書く問題について質問します。 (3)までは自力で書けて実行結果もこの通りになったのですが、 (4)が分からずに、実行結果では値の部分がnullと出力されて しまいました。自分でもこの記述は間違っているというのは感じる のですが、どうしたら値がちゃんと格納されるのか分かりません。 「ArrayListより、HashMapを取得する。」←特にこの部分を どう記述してよいのか・・・ 分かる方、上記の部分の記述方法だけでも構わないので教えて下さい。 『自分で書いたプログラム』 import java.util.*; import java.io.*; public class Sample02{ public static void main(String[] args)throws IOException{ ArrayList list = new ArrayList(); System.out.println("何回で入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); for(int i=0; i<num; i++){ HashMap map = new HashMap(); System.out.println("名前を入力して下さい。"); String name = br.readLine(); System.out.println("年齢を入力して下さい。"); String age = br.readLine(); System.out.println("性別を入力して下さい。"); String sex= br.readLine(); map.put("名前", name); map.put("年齢",age); map.put("性別",sex); list.add(name); list.add(age); list.add(sex); } for(int i=0; i<num; i++){ HashMap map = new HashMap(); String name = (String)map.get("名前"); String age = (String)map.get("年齢"); String sex = (String)map.get("性別"); System.out.println("名前=" + name); System.out.println("年齢=" + age); System.out.println("性別=" + sex); } } }

    • ベストアンサー
    • Java
  • hashMap.getその2

    たびたび、ほんとすいませんが またご質問させて下さい。 先ほど、以下の通り教えて頂きまして 訂正したところエラーは出なくなりました。 MyData myData = (MyData) hashMap.get("A"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); データは以下の通りです。 --------------- A,2003/1/1,スイカ B,2003/2/1,バナナ C,2003/3/1,メロン D,2003/4/1,イチゴ --------------- 正しい表示は、 「日付:2003/1/1 名前:スイカ」 と、表示されなければいけませんが 「日付:2003/4/1 名前:イチゴ」 と、一番最後のレコードが表示されてしまいます。 一行追加しても、やはり一番最後のレコードが表示されてしまいます。 System.out.printlnで確認したところ、hashMapのキーはきちんとセットされているようです。 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • HashMap(J2SDK1.4.2_09)について

    import java.util.*; class BubbleSort { public static void Sort(double[] a) { HashMap hmap = new HashMap(); // ☆ int m, i, j; double n, t; for(i=0; i<a.length; i++) { hmap.put(a[i], i); // (1) } for(i=0; i<a.length; i++) { m = hmap.get(a[i]); // (2) if(m >= 9) { System.out.println("キー " + (m+1) + " の値=" + a[i]); } else { System.out.println("キー " + (m+1) + " の 値=" + a[i]); } } } public static void main(String args[]) { double[] a = {7.6, 7.8, 5.6, 4.1, 0.3, 9.9, 1.5, 8.1, 7.1, 5.3}; Sort(a); } } 上記のように、(1)ではkey(main文にある各配列要素)をvalue(keyの要素に対応する番号)に対応付けする、(2)では指定したキーに対応した値を返す、といったことをしたいのですが、エラーが出てしまいコンパイルできません。J2SDK5.0では、☆の部分を、 HashMap<Double,Integer> hmap = new HashMap<Double,Integer>(); のようにすればコンパイル、実行できます。しかし事情があって1.4でしたいのです。どのようにすればできるでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java
  • ArrayListからHashMapの変換

    質問1) ArrayListからHashMapの変換(処理要件は満たすが、より良い方法がないか) 質問2) より良い設計はどうするべきか ※ 長文です。すいません。 == 前提条件:  工程) 保守フェーズ  環境) 3階層のWebシステム(クライアント/AP/DB)、AP実行環境はJava(1.4)、DBはOracle(10g) 処理の目的:  DBに存在するレコードの一覧を画面に表示する。  ただし存在しないレコードはnull(空)表示する。 以下テーブルが存在します。 ----------テーブルイメージ---------------- 内部キー(ID)  表示順序   画面表示名 (以降のカラム省略) ---------------------------------------- 1         1        AAAAAA 2         3        CCCCCC 3         5        DDDDDDD ---------------------------------------- 画面表示は以下です。表示枠は5つ。その他の項目も存在する。 ------------画面表示イメージ-------------- 1: AAAAAA 2: (空) 3: CCCCCC 4: (空) 5: DDDDDDD ----------------------------------------- 現状: DB参照は内製のORマッパを使用します。その内のひとつ、メソッドAは 上記テーブルを対象に3つのDTO(Data Transfer Object)を保持したArrayListを返却します。(orderは内部キー) 一方、画面表示ではkey=Valueでの取扱いが有利なため、HashMapで組んでいます。 このため、新たに構築したHashMapにArrayListの内容を順次展開しながら、Mapに 詰めなおすロジックが必要となっています。 (擬似コード)------ List list = ORマッパ.メソッドA(); Map map = new HashMap(); int order = 0; int listIndex = 0; DTO dto = null; for (int i = 0; i < DISPLAY_MAX_COUNT; i++) {   dto = (DTO)list.get(listIndex);   order = dto.get表示順序();   if (i == order) {     map.put((String)i, dto);      listIndex++;    } else {     map.put((String)i, null);   } } (擬似コード)------ 以上を踏まえ、質問いたします。 質問1) ロジックに対するInput/Outputを変更しない前提で、 ArrayListからHashMapの変換でよりよい方法はないか。 質問2) 仮に設計や製造を一からやりなおすことができるとしたら、 より良い設計はどうするべきか。 長文申し訳ないです。最後まで目を通していただきありがとうございます。

専門家に質問してみよう