我正在练习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;
}
答案 0 :(得分:2)
indexOf()
永远不会抛出NullPointerException
,var.indexOf
与var == null
除外。而这种类型的异常由Java自动处理。
但您的代码令人困惑。在大多数情况下,indexOf
是一个实例方法。在静态方法的情况下,当然可以避免该问题。例如:
public static void Foo (Bar b) {
if(b != null) {
//do something
}
}
这称为总方法:如果b
为null
,则不会发生任何事情。
但是在大多数情况下,您编写实例方法。调用此类方法且实例为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。