空参数 java 空指针

null argument java null pointer

这是我的代码,我不知道为什么“one == null”和“two == null”总是 False,而且我不能向我的方法发送任何 Null 参数! 请帮助我

public class RepeatInString {
    public int StringInString(String one, String two) {
        if (one.equals("") || two.equals("") || one == null || two == null){
            return 0;
        }
        else{
            char[] oneChar = one.toCharArray();
            char[] twoChar = two.toCharArray();
            int repeatCounter = 0;
            int matchChars = 0;
            for (int i=0 ; i < (one.length()-two.length()+1) ;i++ ){
                matchChars = 0;
                for (int j=0; j<two.length() ;j++) {
                    if (oneChar[i + j] == twoChar[j])
                        matchChars += 1;
                    else
                        break;
                }
                if (matchChars == two.length())
                    repeatCounter += 1;
            }
            return repeatCounter;
        }
    }

如果您传递 null 参数,您将得到 NullPointerException,因为您正在执行 one.equals("")。任何空值。将抛出 NullPointerException。你更适合:

 if (one == null || two == null || one.equals("") || two.equals("")){

如果第一个条件为真,其余条件将被忽略。

'dot' 是 'dereference' 运算符。意思是:拿点左边的东西,跟着参考,在你找到的那个物体上,做这个操作。

因此,如果您编写 x.foo() 并且 x 为空,您将得到 NullPointerException.

表达式 a || b || c 已解析 left-to-right。首先计算a。如果是真的,评估结束,结果已经很清楚了。如果为假,则b被解析,依此类推。

所以,假设 one 为空。

首先,one.equals("") 被评估(注意,你应该使用 one.isEmpty(),这更符合习惯)。 one 为 null,因此,此评估导致抛出 NullPointerException,然后执行结束。

你大概想要 if (one == null || two == null || one.equals("") || two.equals("")) {.

除了,你也不想要那个

null 不是 'empty' 的替代品。 null 最好理解为:未知或无值。

所以,如果我问你:是'this unknown value in this other unknown value',唯一可能的答案是:“我不知道”。

如果您用 truefalse 回答该问题,那么您就是在撒谎,或者至少是在猜测。不要那样做。在这种情况下,如果提供了 null, 抛出 nullpointerexception 是完全明智的。

有时您从外部系统读取输入,明确选择将空输入视为空字符串或其他一些标记值是完全可以接受的。如果是这种情况,请明确地在系统边界上执行此操作。