强制空指针异常

时间:2014-03-24 03:47:12

标签: java

我正在练习JUnit测试,我不确定在NullPointerExceptions发生时该怎么做。

我目前正在创建自己的indexOf()方法,我将其与原始indexOf()进行比较。我不确定如何从我的自定义indexOf()创建类似的输出,以便在原始indexOf()具有NullPointerException时获得相同的输出。

我想过简单地给出NullPointerException给我的错误的输出,但我不知道如何做到这一点

这是我的代码:

public static int myIndexOf(char[] str, int ch, int index) {
    if (str == null) {
        // output NullPointerException
    }
    if (str.length <= index || index < 0) {
        return -1;
    }
    for (int i = index; i < str.length; i++) {
        if (index == str[i]) {
            return i;
        }
    }
    // if not found
    return -1;
}

3 个答案:

答案 0 :(得分:2)

indexOf()永远不会抛出NullPointerExceptionvar.indexOfvar == null除外。而这种类型的异常由Java自动处理。

但您的代码令人困惑。在大多数情况下,indexOf是一个实例方法。在静态方法的情况下,当然可以避免该问题。例如:

public static void Foo (Bar b) {
    if(b != null) {
        //do something
    }
}

这称为总方法:如果bnull,则不会发生任何事情。

但是在大​​多数情况下,您编写实例方法。调用此类方法且实例为null时,Java虚拟机将自行抛出NullPointerException

此外,在您提供的静态方法中,您调用str.length,因为str可以是null,Java虚拟机将检查此内容并抛出NullPointerException方法本身也是如此。


但是,您可以使用以下模式测试JUnit中是否抛出异常:

@Test(expected = ExpectedException.class)
public void test () throws ExpectedException {
    Foo f = new Foo();
    f.methodThatThrowsException();
}

如果没有抛出ExpectedException类型的异常,JUnit会认为此测试失败。

答案 1 :(得分:1)

如果您使用的是Java 8,则可以使用一种奇特的小方法来处理这个问题。

public static int myIndexOf(char[] str, int ch, int index) {
    Objects.requireNonNull(str);
    if (str.length <= index || index < 0) {

如果给定的参数为NullPointerException,则此方法将抛出null。您也可以这样使用它:

Objects.requireNonNull(str, "The given string cannot be null");

提供您自己的错误消息。

答案 2 :(得分:0)

throw new NullPointerException();

会做到的。更多&#34;有机&#34;:

Object c = null; c.toString();

会这样做。

但请注意indexOf不会引发NPE。