Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Listの取得について

JDK5.0

Seasar2のS2JDBCを使用して、select結果をList型で取得する。
といった事をしております。

List result = (List) handler.execute(null);
for (int i = 0; i < result.size(); ++i) {
    System.out.println(result.get(i));
}

上記の記述で実行すると、コンソールには
src.DBResultSet@1ea5671
src.DBResultSet@1d15445

のような文字列が表示されてしまい、値が出力されません。
デバッグモードで、result(List型)には値が入っている事を確認しております。
以下はデバッグ時の変数部分です(見づらいですが。。)

result (ArrayList<E>)
 -elementData (Object[16])
  -[0]
    COMM     null
    DEPTNO   "20"
    EMPNO    "7369"
    ENAME    "SMITH"
    HIREDATE "1980-12-17"
    JOB      "CLERK"
    MGR      "7902"
    SAL      "800"
  +[1]
以下略

引き続き色々試行しておりますが、ご教示いただけると助かります。
宜しくお願い致します。

7

回答

4962

閲覧

7件の回答

評価

0

バージョン5ならキャストなしで書いてみてよ。
リストの中のオブジェクトが分からない。

評価

0

System.out.printlnはそのオブジェクトの値を表示するのではなく、そのオブジェクトの文字列表現を表示します。
オブジェクトがStringならそのままですが、そうでないならtoString()の結果が表示されます。
toString()は自分で書かない限りは、そのようにオブジェクトの情報を表示するものです。

評価

0

返信ありがとうございます。

試行結果としては、
1.
List result = (List) handler.execute(null);
for (int i = 0; i < result.size(); ++i) {
    System.out.println((String)result.get(i));
}
とすると
Exception in thread "main" java.lang.ClassCastException: src.DBResultSet
    at src.Main.main(Main.java:35)
というエラーとなる。

2.
resultの各要素に入っているのがmapのようなので
List result = (List) handler.execute(null);
for (int i = 0; i < result.size(); ++i) {
    Object obj = result.get(i);
    Map map = (Map)obj;
    System.out.println(map.get("EMPNO"));
}
とすると
Exception in thread "main" java.lang.ClassCastException: src.DBResultSet
    at src.Main.main(Main.java:33)
というエラーとなる。

> バージョン5ならキャストなしで書いてみてよ。
> リストの中のオブジェクトが分からない。
キャストなし、というのは
List result = handler.execute(null);
とするという事ですか?
こうすると、S2JDBCのSelectHandler.executeの戻りがList型のため、コンパイルエラーとなってしまいます。

> System.out.printlnはそのオブジェクトの値を表示するのではなく、そのオブジェクトの文字列表現を表示します。
> オブジェクトがStringならそのままですが、そうでないならtoString()の結果が表示されます。
> toString()は自分で書かない限りは、そのようにオブジェクトの情報を表示するものです。

オブジェクトの値を表示したい場合は、Stringオブジェクトで無い限りはtoString()をつけるべき、という事でしょうか?
System.out.println(result.get(i).toString());
のようにしてみましたが、結果は同様でした。

List.add("str")のようにListの要素がStringやintといった場合はわかるのですが、
Listの要素がObjectでその中に複数データを持っている構造だと、どんな型のオブジェクトに当てはめればいいのかわからず混乱しております。

ひとまず、
Object obj = result.get(i);
として、objに入っている値を取得できるように調査してみます。
-obj
  +COMM     null
  +DEPTNO   "20"
  +EMPNO    "7369"
  +ENAME    "SMITH"
  +HIREDATE "1980-12-17"
  +JOB      "CLERK"
  +MGR      "7902"
  +SAL      "800"

引き続き、宜しくお願い致します。

評価

0

objとあるのは、もしかしてMapなんじゃない?
想像しただけだけど。

評価

0

>toString()をつけるべき、という事でしょうか?
違います。
そのクラスにtoString()メソッドを定義しないといけない、ということです。

>System.out.println(result.get(i).toString());
以前のコードは内部で同じことをやっているのです。

そもそも、
>Exception in thread "main" java.lang.ClassCastException: src.DBResultSet
>    at src.Main.main(Main.java:33)
の例外の意味は理解していますか?「エラーになった。だめだ」で終わらずに、その意味を理解して、なにがいけないのか、ではどうしたらいいかを考えないと。

評価

0

不良生徒 様 返信ありがとうございます。

> objとあるのは、もしかしてMapなんじゃない?
もしobjがMapならば、「2」の
    Object obj = result.get(i);
    Map map = (Map)obj;
でクラスキャストエラーが発生しないのでは、と思いました。
キャストするクラスをHashMapとLinkedHashMapでも試してみましたが、
    HashMap map = (HashMap)obj;
で同様のクラスキャストエラーが発生しました。

引き続き調査して参ります。
貴重なご意見、ありがとうございました。


評価

0

mio 様 返信ありがとうございます。

>そもそも、
>>Exception in thread "main" java.lang.ClassCastException: src.DBResultSet
>>    at src.Main.main(Main.java:33)
>の例外の意味は理解していますか?
「ある型にキャストしようとしたけど、型の互換性がなかった」という認識しかしておりませんでした。
調べて、「src.DBResultSetが元のオブジェクトの型である」という事もわかりました。
上記を踏まえて、
List result = (List)handler.execute(null);
for (int i = 0; i < result.size(); ++i) {
  DBResultSet dbrs = new DBResultSet();
  dbrs = (DBResultSet)result.get(i);
  System.out.print(dbrs.ゲッターメソッド);
}
とする事で、値の取得ができました。

>「エラーになった。だめだ」で終わらずに、その意味を理解して、
>なにがいけないのか、ではどうしたらいいかを考えないと。
ごもっともです。
今回はListの要素のオブジェクト型がわからなかった事が問題でした。型の情報はエラーにしっかり記述されているのに(java.lang.ClassCastException: src.DBResultSet のsrc.DBResultSet)、意味を理解せず解決策ばかり模索していたのが失敗原因だと思います。

貴重なお時間を割いていただいた上に的確な回答をいただき、ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。