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

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

0

ArrayListにデータが入っているかの判断

こんにちは、
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{
  }
をで判断しているのですが、どちらの方がよいのでしょうか? またはどちらでも問題ないのでしょうか?
宜しくお願いします。

16

回答

48952

閲覧

16件の回答

評価

0

>Exceptionが発生してしまいますので使えません。
これだけでExceptionが発生することはありません。

>どちらの方がよいのでしょうか?
実際に動作させているならわかると思いますが、どちらでも問題ありません。
でも、「あるかないか」を判定したいなら(メソッドの意味からして)後者でしょう。

評価

0

>だとExceptionが発生してしまいますので使えません。

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

「List hoge;」を「List hoge = null;」とすれば、最初のヤツでも通るでしょ。

評価

0

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

評価

0

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

return new ArrayList();

とでもしているのでしょう。

評価

0

クラス変数にしちゃってるのか、と考えたんだけど、違うのか。
とにかく、「DBから取得のメソッド」が何を返しているのかを理解しましょう。

評価

0

仕様の話になりますね。
DBから取得するメソッドとやらが、データがないときに何を返すのか確認しておきましょう。
ちなみに参考までに、sizeが0のArrayListは、nullと同値にはなりません。

評価

0

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

return new ArrayList();
が戻り値になっていたので、nullがfalseになっていました。ありがとうございました

評価

0

ちなみに皆さんにお伺いしたいのですが、
DBのデータを複数行格納するときどのような手法で行いますか?私はVectorでとることがおおいのですが・・・
宜しくお願いいたします。

評価

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に説明があったはずです。

評価

0

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

ヒット数が0なら、リターンは要素数0のListが一般的でしょう。
nullで返るというパターンも、なんらかの異常系では有り得ないことではありませんが、Javaでは通常、そうした場合Exceptionを用います。

評価

0

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

ただ、mioさんも言ってますが、Vectorは使わないほうがいいでしょう。

評価

0

一口メモ
DBの値を取得するメソッド

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

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

to 適当さん。

評価

0

先に件数が分かるのであれば、単なる配列になるかも知れません。

評価

0

Listで取得したものをインデックス番号で参照するのが
主流でしょうか?

評価

0

インデックスが分かるのならそうだし、順次アクセスするのならIteratorかも知れません。
結果を格納する方法は自ずと限られてきますが、それをどう使うかは用途に拠るのでなんとも言えません。

評価

0

>杏さん

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

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