gpt4 book ai didi

java - 在不导致 NullPointerException/IndexOutOfBoundsException 的情况下检查 HashMap 是否为空?

转载 作者:搜寻专家 更新时间:2023-11-01 03:45:41 24 4
gpt4 key购买 nike

所以我正在为我的 java 类(class)做一个邮件服务器类的程序,(我会称自己为 Java 初学者)虽然我已经完成了所有必需的部分,但程序存在一些问题,而作业没有'不需要它,我想知道为什么会这样以及如何解决它。总而言之,我有两种方法可以检查特定用户拥有多少邮件项目,另一种方法返回用户邮箱中第一个邮件项目(按照 LIFO 规则)。

因此,如果用户同时拥有 A.Has 邮箱和 B.Has at least 1 mail in the mailbox 则没有问题,但当 a 和/或 b 不正确时,这实际上不起作用。这就是我试图解决的问题。我认为这就像检查 mailbox.containsKey(who)==false 和/或 mailbox.get(who).get(0) == null 是否足够一样简单但是当我这样做时我得到了 java.lang. lang.IndexOutOfBoundsException:索引:0,大小:0。

我已经尝试了多种类型的检查它是否为 ==true/false null 等。我尝试将异常一起抛出,但似乎没有任何效果,虽然抛出异常可能以某种方式起作用我想用另一种方式解决它,因为 throw 命令看起来有点懒

这是我检查 A 和 B 的方法:

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

这个方法被这两个方法利用了:

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;
}
}

我不确定您是否需要我的更多代码来帮助我。告诉我是否是这种情况,但需要澄清的是,“邮箱”是 HashMap ,who 参数是您要检查他或她的邮箱的人。谢谢。

最佳答案

我在下面列出的代码中存在几个问题

第一个问题

if 条件是错误的,即使 map 不包含键也是如此

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

所以即使键不在 map 中,您也会返回 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 来避免这种 `if 条件

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;
}

关于java - 在不导致 NullPointerException/IndexOutOfBoundsException 的情况下检查 HashMap 是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58240235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com