首页 > 解决方案 > 从 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;
    }
} 

标签: javacollectionsnullpointerexceptionqueue

解决方案


调用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))

或者你可以使用类似StringUtilsApache Commons的东西,它有各种空安全相等运算符。这也将支持其他边缘情况(例如双方都是null)。

是否ans应该null放在首位是一个不同的问题。由于您正在Queue使用该poll方法获取 a 的值,这意味着当时aQueue是空的。


推荐阅读