Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(ArrayListにデータが入っているかの判断)
閲覧数:14700
掲示板(ArrayListにデータが入っているかの判断)
名前
題名 ArrayListにデータが入っているかの判断
質問内容

質問を評価する
(0ポイント)
こんにちは、
DBからデータを取得してArrayListに格納して、データが
あるかないかで次の処理の判断をしようとしています。
例えば
 ArrayList alist = DBから取得のメソッド
 if(alist==null){
 }else{
 }
だとExceptionが発生してしまいますので使えません。
 ArrayList alist = DBから取得のメソッド
  if(alist.size()>0){
  }else{
  }

   ArrayList alist = DBから取得のメソッド
  if(!alist.isEmpty()){
  }else{
  }
をで判断しているのですが、どちらの方がよいのでしょうか? またはどちらでも問題ないのでしょうか?
宜しくお願いします。
質問日時 2007-08-10 14:34:03
名前
mio
回答内容

回答を評価する
(0ポイント)
>Exceptionが発生してしまいますので使えません。
これだけでExceptionが発生することはありません。

>どちらの方がよいのでしょうか?
実際に動作させているならわかると思いますが、どちらでも問題ありません。
でも、「あるかないか」を判定したいなら(メソッドの意味からして)後者でしょう。
回答日時 2007-08-10 14:40:52
名前
回答内容

回答を評価する
(0ポイント)
>だとExceptionが発生してしまいますので使えません。

そのExceptionが何を意味するのか、ちゃんと読んでないんじゃない?

「List hoge;」を「List hoge = null;」とすれば、最初のヤツでも通るでしょ。
回答日時 2007-08-10 14:49:01
名前
回答内容

回答を評価する
(0ポイント)
mio
 ご回答ありがとうございます。
Edosson
 ありがとうございます。
 Exceptionが発生しているのは、DBから取得後にデータが
 ないのにないINDEXを指定して値を取得しようとする時に
 発生するIndexOutofBoundsExceptionでした。ただわからないのが
 ArrayList alist = null; 
 alist = DBから取得のメソッド
 if(alist==null){
 }else{
   alistからローカル変数に格納
 }
の時に何もデータが無いのにfalseとなってしまいます。
alistはnullじゃないのでしょうか?

回答日時 2007-08-10 15:23:03
名前
回答内容

回答を評価する
(0ポイント)
alistが空なのと、alistにnullが入っているのは違います。DBから取得のメソッドの詳細が分からないので何とも言えませんが、それでalist == nullがfalseになるということは、DBからの取得のメソッドはデータがない時に

return new ArrayList();

とでもしているのでしょう。
回答日時 2007-08-10 15:26:34
名前
回答内容

回答を評価する
(0ポイント)
クラス変数にしちゃってるのか、と考えたんだけど、違うのか。
とにかく、「DBから取得のメソッド」が何を返しているのかを理解しましょう。
回答日時 2007-08-10 15:36:53
名前
回答内容

回答を評価する
(0ポイント)
仕様の話になりますね。
DBから取得するメソッドとやらが、データがないときに何を返すのか確認しておきましょう。
ちなみに参考までに、sizeが0のArrayListは、nullと同値にはなりません。
回答日時 2007-08-10 16:03:07
名前
回答内容

回答を評価する
(0ポイント)
nullがfalseの原因がわかりました。DBから取得するメソッドで、
 ArrayList hoge = new ArrayList();
  if(true){
    DBから取得
  }
 return hoge
としているので、falseの時は適当さんのおっしゃっていた通り

return new ArrayList();
が戻り値になっていたので、nullがfalseになっていました。ありがとうございました
回答日時 2007-08-10 16:11:10
名前
回答内容

回答を評価する
(0ポイント)
ちなみに皆さんにお伺いしたいのですが、
DBのデータを複数行格納するときどのような手法で行いますか?私はVectorでとることがおおいのですが・・・
宜しくお願いいたします。
回答日時 2007-08-10 16:15:54
名前
回答内容

回答を評価する
(0ポイント)
すこしおせっかいを。

要素が何もないことを表すのに、nullを返すよりも要素数が0のものを返すほうが一般的にはよい方法です。
なぜなら、

int[] ary = getIntArray();

とした場合、要素がない場合にnullが返ってくると、全ての要素を表示する場合、

if (ary == null) {
    for (int i = 0; i < ary.length; i++)
        System.out.println(ary[i]);
}

としなければなりませんが、要素数が0の要素が返ってくるなら、

for (int i = 0; i < ary.length; i++)
    System.out.println(ary[i]);

で済みます。nullを許すと、いたるところでnullチェックが必要となってしまいますので、できる限りnullは使用しないほうがいいでしょう。
nullの場合に異なった振る舞いをさせたい場合、Null Objectパターンを適用することを検討してください。

たしか、Effective Javaに説明があったはずです。
回答日時 2007-08-10 16:19:40
名前
mio
回答内容

回答を評価する
(0ポイント)
>私はVectorでとることがおおいのですが・・・
Vectorでも別段問題はありませんが、これは「古い」APIで、いずれ廃止されることになるかも知れません。
現在はVectorではなく、Listを使うようになっています。

ヒット数が0なら、リターンは要素数0のListが一般的でしょう。
nullで返るというパターンも、なんらかの異常系では有り得ないことではありませんが、Javaでは通常、そうした場合Exceptionを用います。
回答日時 2007-08-10 16:37:03
名前
回答内容

回答を評価する
(0ポイント)
>DBのデータを複数行格納するときどのような手法で行いますか?
具体的な状況が分からないので、これだけでは何とも・・・

ただ、mioさんも言ってますが、Vectorは使わないほうがいいでしょう。
回答日時 2007-08-10 16:43:40
名前
回答内容

回答を評価する
(0ポイント)
一口メモ
DBの値を取得するメソッド

1.Listインスタンスを作成
2.[ループ]Listに結果を1件づつadd
3.Listを返す

大体のDAOはこんな感じで動いていると思われます。

to 適当さん。
回答日時 2007-08-10 18:02:09
名前
mio
回答内容

回答を評価する
(0ポイント)
先に件数が分かるのであれば、単なる配列になるかも知れません。
回答日時 2007-08-10 18:35:44
名前
回答内容

回答を評価する
(0ポイント)
Listで取得したものをインデックス番号で参照するのが
主流でしょうか?
回答日時 2007-08-10 19:19:06
名前
mio
回答内容

回答を評価する
(0ポイント)
インデックスが分かるのならそうだし、順次アクセスするのならIteratorかも知れません。
結果を格納する方法は自ずと限られてきますが、それをどう使うかは用途に拠るのでなんとも言えません。
回答日時 2007-08-10 19:42:04
名前
回答内容

回答を評価する
(0ポイント)
>杏さん

List、Set、配列などなど、一概には言えませんからね。複数行がまとまりで意味を持つなら、それだけでクラス作ったりする可能性もありますし・・・
回答日時 2007-08-10 21:05:37

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



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道