关于java:程序员你是如何降低NPE的

44次阅读

共计 1784 个字符,预计需要花费 5 分钟才能阅读完成。

程序员,如果零碎忽然报了一个空指针异样,你必定像吞了一只苍蝇一样难堪。

那么如何在日常开发过程中升高 NPE?

问题 答复
现状 返回空值会呈现大量的空指针异样
目标 改良办法的返回值,升高呈现空指针异样
实现门路 办法返回空集合或者空数组

跟我来!

背景

上面的办法看起来很常见。

private final List<Chesse> chessesInStock= ...

public List<Cheese> getCheeses(){return cheesesInStock.isEmpty()?null:new ArrayList<>(cheesesInStock);
}

如果你去购买芝士的时候没有可用的芝士,仿佛没有理由特地指出这种场景。

然而你这么做的话,客户端须要增加额定代码来解决可能返回空值的状况。示例代码如下:

List<Cheese> cheeses = shop.getCheeses();

if(cheses != null && cheeses.contains(Cheese.STILTON)){System.out.println("jolly good");
}

每一个返回空值的办法都应用下面这种解决形式,应该替换为返回一个空集合或者空数组。

这是一种谬误的趋势, 因为程序员些客户端代码可能会遗记写非凡代码来解决返回的空值。

这个谬误可能会继续很长时间,因为这样的办法通常会返回一个或多个对象。

不返回空集合空数组的争执

返回空值替换为返回空容器也会使得办法的实现变得复杂。

通常争执的是:返回空值比返回空集合更好是因为创立一个空的容器有性能耗费。

这个论点不对,起因有两点:

一,没有必要放心性能除非有证据显示创立一个空容器整的有损性能;

二,你能够返回一个空集合或者数组而不必创立它们。

返回空集合

上面是一个典型的代码返回一个可能的空集合,通常,这就是你所须要的。

public List<Cheese> getCheeses(){return new ArrayList<>(cheeseInStock);
}

没有证据证实创立一个空集合会有损性能,你能够返回一个雷同的不可变空集合来防止创立空集合。因为不可变对象是能够被自在共享的,上面是应用代码。

需要场景 代码
空 List Collections.emptyList()
空 Set Collections.emptySet()
空 Map Collections.emptyMap()

然而记住,以上这些操作是只是优化,很少被调用,如果你认为你须要它,在调用前后进行性能比照,确保它真的有用。

public List<Cheese> getCheeses(){return cheesesInStock.isEmpty()?Collections.emptyList():new ArrayList<>(cheesesInStock);
}

返回空数组

应用数组的场景跟汇合是雷同的,永远不要返回空值,应该返回一个长度位 0 的数组,经常,你应该简略的返回一个有适当长度的数组,兴许长度是 0。

留神咱们传递一个长度为 0 的数组到 toArray 办法中来代表冀望的返回类型;

public Cheese[] getCheeses(){return cheesesInStock.toArray(new Cheese[0]);
}

如果你认为创立一个长度为 0 的数组会升高性能,你能够返回同一个长度为 0 的数组,因为所有长度为 0 的数组都是不可变的;

private static final Cheese[] EMPTY_ARRAY= new Cheese[0];

public Cheeses[] getCheeses(){return cheesesInStock.toArray(EMPTY_ARRAY);
}

在优化版本中,咱们传递了同一个空的数组到每一个 toArray 的调用,这个数组将会从 getCheeses 返回,无论 cheesesInStock 是不是空的,不要冀望预调配数组能够进步性能,钻研显示这是事与愿违的。

return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]);

小结

如果你只能记住一句话: 返回空集合或者数组而不要返回空值

返回空值会让你的 API 更难应用并且更容易出错,并且无性能劣势;

原创不易,关注诚可贵,转发价更高!转载请注明出处,让咱们互通有无,共同进步,欢送沟通交流。

正文完
 0