HashMapのは、NullPointerExceptionが/はIndexOutOfBoundsExceptionを引き起こすことなく空であるかどうかの確認?

DJ Oakman:

だから、(私は自分自身のJava初心者を呼ぶだろう)と私は必要なすべての部品を完了している一方で、割り当てがそれを必要としませんが、そのプログラムといくつかの問題がある、私のJavaのコースのプログラムのメールサーバの種類をしています、私はこの方法で行動し、どのようにそれを修正することです理由を知っていただきたいと思います。だから私は、チェックどのように多くのメール、特定のユーザーが持っているアイテムや(LIFOルールによって)ユーザーのメールボックスに最初にメールアイテムを返し、別の1、その2つのメソッドを持って、それを要約します。

および/またはbが真でないときにそう言った、メールボックス内の少なくともユーザーA.Has両方のメールボックスとB.Has 1通のメールは問題がない場合は一方で、これは実際に動作しません。そして、それは私が修正しようとしたものです。私はそれがmailbox.containsKey()== falseをおよび/またはmailbox.get()に.get(0)== nullは十分だろうが、私はこれを行うとき、私は、Javaを取得する場合の両方をチェックするような単純なことだろうと思いました。 lang.IndexOutOfBoundsException:インデックス:0、サイズ:0。

私が試したなど。それの==真/偽nullはちょうどすべて一緒に例外をスローする場合、私はどちらかのチェックの複数の種類を試してみたが、何も動いていないようにみえ、多分例外をスローしながら、私が望む何らかの方法で仕事ができます投げコマンドとして別の方法でそれを解決するのは少し面倒と思われます

ここで私はAとBの両方をチェックする私の方法は次のとおりです。

private boolean errorHandling(String who){  
    if (mailbox.containsKey(who)==false ||  mailbox.get(who).get(0) == null    ){ 
        return true;  
    }
    else{
        return false;
    }
}

この方法は、これら2つの方法で利用されます。

public MailItem getNextMailItem(String who)
{
    if (!errorHandling(who) ){   
        MailItem item2 = mailbox.get(who).get(0);
        mailbox.get(who).remove(0);
        return item2;
    } else{
        System.out.println("that user dosent have a mailbox");
        return null;
    }
}

public int howManyMailItems(String who)
{
    if (!errorHandling(who) ){  //To check if user has a mailbox
        return mailbox.get(who).size();
    }
    else{
        System.out.println("that user dosent have a mailbox");
        return 0;
    }
}  

あなたは私を助けたりしないようにもっと自分のコードの必要がある場合、私はわかりません。それが事実であるが、明確にする場合は、「メールボックス」はハッシュマップで、パラメータは、あなたが自分のメールボックスをチェックしたい人が誰であるかを教えてください。ありがとうございました。

デッドプール :

私は下に記載されている我々のコードに問題がいくつかあります

第一の問題点

if条件が間違っているとこれは、マップがキーが含まれていない場合も同様となります

if (mailbox.containsKey(who)==false ||  mailbox.get(who).get(0) == null)

  // mailbox.containsKey(who) will return false if map doesn't contain key
  // then false==false ---> always true

あなたは真のも、キーを返却しているので、マップ内に存在していない、との必要がないerrorHandling方法は。あなただけ使用することができますcontainsKey

if (containsKey(who) ){      // if key exists then proceed
   MailItem item2 = mailbox.get(who).get(0);
   mailbox.get(who).remove(0);
   return item2; }
else{                   // else don't proceed 
    System.out.println("that user dosent have a mailbox");
    return null;
}

あなたも、使用して、この`かの条件を避けることができgetOrDefaultを

default V getOrDefault(Object key, V defaultValue)

第二の問題

第二部if条件が間違っているmailbox.get(who).get(0) == null、あなたが以下のようにコードをリファクタリングすることができますので、あなたは、そのキーの空のリストを持っているかもしれません

List<MailItem> listItem = mailbox.get(who, new ArraysList<>());  //get list if key exists or else get empty list

 if(!listItems.isEmpty()) {
      return listItems.remove(0);    //if list has items delete at index 0
   }
 else{
    System.out.println("that user dosent have a mailbox");
    return null;
  }

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=318097&siteId=1