我的代码类似于以下内容: -
class A
{
private HashMap<Character, Boolean> myMap;
public A()
{
myMap = new HashMap<Character, Boolean>();
String mychars = "asdfzxcvqwer";
for ( char c : mychars.toCharArray() )
myMap.put(c, true);
}
public doo(String input)
{
StringBuilder output = new StringBuilder();
for ( char c : input.toCharArray() )
{
if ( myMap.get(c) )
output.append(c);
}
}
...
...
}
我在第if ( myMap.get(c) )
行得到一个空指针异常 - 我做错了什么?
答案 0 :(得分:44)
如果c
中未包含myMap
,则会返回null
,boolean
无法取消装箱Boolean b = myMap.get(c);
if(b != null && b){
...
。
尝试:
{{1}}
答案 1 :(得分:11)
如果myMap
不包含与c
匹配的密钥,则myMap.get(c)
将返回null。在这种情况下,当JVM将其期望为java.lang.Boolean
对象的对象解压缩到boolean
原语中以执行条件时,它会找到一个空对象,因此会抛出java.lang.NullPointerException
。
以下块与您的示例中的内容相同,并且应该更容易理解为什么会有NullPointerException
:
if (((Boolean) myMap.get(c)).booleanValue())
我会把你原来的条件重写为:
if ( myMap.containsKey(c) )
我希望这会有所帮助。
答案 2 :(得分:5)
更改
if ( myMap.get(c) )
到
if ( myMap.containsKey(c) && myMap.get(c))
答案 3 :(得分:3)
如果地图中没有必需Character
的实体,则map.get(key)
会返回null
,而if
语句会导致NullPointerException
投掷。
答案 4 :(得分:3)
在黑暗中刺伤:地图中是否有分配给c
的特定字符的条目?如果没有,Java可能会尝试将空值取消装箱......
答案 5 :(得分:3)
更改此
for ( char c : input.toCharArray() )
{
if ( myMap.get(c) )
output.append(c);
}
对于此
for ( char c : input.toCharArray() )
{
if ( myMap.containsKey(c) )
output.append(c);
}
将利用地图定义的方法来检查地图上是否已注册某个键。我要离开for
,因为您似乎想要检查一组密钥。
myMap.get(c)
会返回与该键相关联的值,如果未注册该键,则返回null
。
作为旁注,请记住,如果您将此方法用于自定义对象,则必须重新定义hashcode
和equals
方法。
建议:我只是想出一个我有的远程想法,如果它不是对你的代码的正确解释只是忽略它。如果你的地图只包含一个布尔值来确定某个值是否“包含”,我强烈建议你改用HashSet
,因为地图在那个环境中没有任何意义。
答案 6 :(得分:2)
你的代码非常混乱。
这是一个工作版本:
import java.util.HashMap;
public class A {
private HashMap<Character, Boolean> myMap;
public A() {
this.myMap = new HashMap<Character, Boolean>();
String mychars = "asdfzxcvqwer";
for ( char c : mychars.toCharArray() )
myMap.put(c, true);
}
public String execute(String input) {
StringBuilder output = new StringBuilder();
for ( char c : input.toCharArray() )
{
if ( this.myMap.get(c) != null )
output.append(c);
}
return output.toString();
}
public static void main(String[] args) {
A test = new A();
test.execute("abc");
}
}
答案 7 :(得分:0)
或者,您可以使用apache.commons.lang3检查Boolean
并处理null
检查BooleanUtils.isTrue(c)
通常会引发NPE的混乱,即在地图上调用get()
或执行if(...)
时。
您的地图声明为:
myMap = new HashMap<Character, Boolean>();
其中包含原始boolean
包装类Boolean
作为映射条目的值。
操作时:
if (myMap.get(c))
myMap
是HashMap
,当调用null
时返回get()
,因为映射中不存在某个键。 null
然后解包到原语boolean
,这是在您单独调用get()
时抛出 NPE 的地方。
答案 8 :(得分:0)
就我而言,我只是用 catch 块处理它,就像这样:
@PostMapping("/findAllLastExecutedApi")
public ResponseEntity<Map<String,List<Results>>>findAllLastExecuted(@RequestBody Map<String,String> uuids) {
try{
// NPE is triggered here :
if(uuids.get("demoId").isEmpty()) {
Map<String,List<Results>> badResults= Collections.singletonMap("Invalid demoId provided, is empty",null);
log.error("Invalid demoId provided, is empty {}",uuids);
return ResponseEntity.ok(badResults);
}
Map<String,List<Results>> results =
this.service.findAll(uuids.get("demoId"));
return ResponseEntity.ok(results);
}catch (NullPointerException e){
log.error("Invalid demoId provided, is null {}",uuids);
throw new NullPointerException("Invalid demoId provided , is null");
}
}