java - 从 String 类的 .equals() 方法获取 NPE。如何调试这个
问题描述
我一直在尝试用 BFS 解决 LeetCode (Open the Lock) 的第 752 个问题。现在,在从队列轮询之后,当我在 if 条件下使用变量(字符串类型)将其与目标字符串等同时,我得到了一个 NPE。
public int openLock(String[] deadends, String target) {
int len = target.length();
Set <String> s = new HashSet <String> (Arrays.asList(deadends));
Queue <String> q = new LinkedList <>();
q.add("0000");s.add("0000");
int cnt = 0;
while(!q.isEmpty()){
int size = q.size();
while(size>0){
String ans = q.poll(); String t="";
if(ans.equals(target))
return cnt;
if(s.contains(ans))
continue;
for(int i=len-1;i>=0;i--){
t=ans; char c = t.charAt(i);
if(c==target.charAt(i))
continue;
int act = c-'0';
int inc = (act+1)%10;
int dec = (act-1);
if(dec<0)
dec=dec+10;
t=t.substring(0,i)+inc+t.substring(i+1);
if(!s.contains(t)){
s.add(t);
q.add(t);
}
t=ans;
t=t.substring(0,i)+dec+t.substring(i+1);
if(!s.contains(t)){
s.add(t);
q.add(t);
}
}size--;
}
cnt++;
}
return -1;
}
}
解决方案
调用equals
左侧所在的任何对象null
都会抛出NullPointerException
. 如果是 ,右手边不会扔null
。所以在这种情况下,你可以通过交换边来避免这种情况:
if(target.equals(ans))
假设当然target
不是null
(我猜不是)。您可以通过在方法的开头添加保护来确保这一点。
if(target == null) throw new NullPointerException("Method parameter `target` should not be null")
出于同样的原因,您通常也将String
常量放在左侧,因为您不必担心它是null
. 例如
if("MyAmazingConstant".equals(maybeNullVariable))
或者
const String MY_AMAZING_CONSTANT = "MyAmazingConstant"
if(MY_AMAZING_CONSTANT.equals(maybeNullVariable))
或者你可以使用类似StringUtils
Apache Commons的东西,它有各种空安全相等运算符。这也将支持其他边缘情况(例如双方都是null
)。
是否ans
应该null
放在首位是一个不同的问题。由于您正在Queue
使用该poll
方法获取 a 的值,这意味着当时aQueue
是空的。
推荐阅读
- ios - 生成的 CGImage 总是模糊的
- javascript - jsPDF导出为带有样式的pdf
- r - 大代数R中的大矩阵运算
- google-app-maker - 使用按钮旋转图像 App Maker
- java - 在 Java 中转义 Json 文本到对象的转换使文本未转义
- c# - Sql Client AddWithValue 空参数不带@符号
- javascript - How to remove existing markers and infobubbles from HERE maps
- regex - Regex doesn't work with IE 11
- android - Targeting API 17 Compile Issue
- javascript - 卡片记忆/匹配游戏:添加和删除类后丢失点击处理程序