JavaRush /Java 博客 /Random-ZH /技巧和技巧。如何在Java应用程序中避免NullPointerException
DarthVictor
第 28 级

技巧和技巧。如何在Java应用程序中避免NullPointerException

已在 Random-ZH 群组中发布
技巧和技巧。 如何在Java应用程序中避免NullPointerException - 1今天,我将向您展示如何在应用程序中避免 NullPointerException 的简单技术。它们很容易遵循,但可以显着提高代码的可靠性和质量。此外,根据我的经验,第一个技巧将对代码的质量产生显着的影响。如果您知道任何其他 Java 编程技巧,请随时在评论中分享。 技巧和技巧。 如何在Java应用程序中避免NullPointerException - 2

对已知字符串文字而不是未知对象调用 equals() 和 equalsIgnoreCase() 方法

equals()始终对您知道不是的已知字符串调用方法null。该方法equals()是对称的,即调用a.equals(b)b.equals(a)会给出相同的结果(ifabnot null),因此许多程序员不注意调用equals()、 ya或 y哪个对象b。如果在 上调用该方法,其副作用之一是 NullPointerException null
Object unknownObject = null;

//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if unknownObject is null");
}

//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}
这是避免 NullPointerException 的最简单技巧,但它本身就带来了巨大的改进,因为该方法equals()随处可见。

如果两者产生相同的结果,请选择 valueOf() 而不是 toString()

由于调用toString()带有值的引用null会引发 NullPointerException,因此最好valueOf()在可以获得相同结果时使用调用,因为调用valueOf()from nullreturns nullInteger对于诸如、或 之类Float的包装类尤其如此。 DoubleBigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
当您不确定某个对象是否存在时,请使用这些提示null

使用null安全的方法和库

有许多开源库承担着测试null. 最常见的之一StringUtils来自 Apache Commons。使用诸如StringUtils.isBlank()isNumeric()等方法isWhiteSpace()。您不必担心抛出 NullPointerException。
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
输出: true true false false 然而,在使用之前,不要忘记阅读null安全方法和类的文档。这是另一个最好的 Java 技巧,不需要太多努力就能带来巨大的改进。

尽量不要null从方法中返回,最好返回一个空集合

这是 Joshua Bloch 在他的《Java:有效编程》一书中描述的另一个很好的 Java 编程技巧。返回空集合或数组时,请确保调用size()或等基本方法length()不会引发 NullPointerException。该类Collections专门声明了空列表、集合和字典的便捷实现:Collections.EMPTY_LISTCollections.EMPTY_SETCollections.EMPTY_MAP。例如:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
同样,您可以使用Collections.EMPTY_SETCollections.EMPTY_MAP而不是返回null

使用@NotNull和@Nullable注释

在方法的描述中,您可以null使用注释@NotNull和 @Nullable 来定义方法安全约定,以指示方法是否可以返回null。现代编译器和 IDE 可以使用这些注释来分析您的代码并提供适当的建议,例如,关于缺少对 的检查的建议null,反之亦然,关于是否可能删除阻塞代码的不必要的检查。例如,此类注释受到 IntelliJ IDE 和 FindBugs 的支持,并且它们也包含在 JSR 305 中。但即使您的 IDE 不支持此类注释,它们本身也将是很好的文档。程序员可以更容易地了解在哪里添加检查@NotNull以及在哪里不添加检查。顺便说一句,这对于 Java 程序员来说是一种相当新的做法,它的传播需要时间。 @Nullablenull

避免代码中不必要的自动装箱和自动拆箱

这不仅会导致创建不必要的临时对象,而且如果包装类是null. 例如,如果 person 条目不包含电话号码并返回 ,以下代码将引发 NullPointerException null
Person ram = new Person("ram");
int phone = ram.getPhone();
使用自动装箱或自动拆箱时,不仅等式,而且不等式<>都>可能导致 NullPointerException。

遵循约定并定义合理的默认值。

在 Java 中避免 NullPointerException 的最佳方法之一是正确声明并遵循编码约定。大多数 NullPointerException 发生在您尝试创建一个对象但没有它所需的所有数据和依赖项时。通过优雅地拒绝此类请求来防止创建未完成的对象,您将避免将来出现大量 NullPointerException。同样,如果允许创建对象,则应该选择合理的默认值。例如,Employee如果没有名称和 ,则无法创建类对象id,但可能没有电话号码。在这种情况下,Employee没有数字的对象可能会返回零null。尽管应该提前考虑对象的这种行为,但检查可能比null拨打不存在的号码更容易。在这种情况下,对哪些字段是null、哪些不是字段有额外的条件将有助于做出正确的决定。一般来说,选择立即崩溃程序还是分配null程序是一个重要的设计决策,一旦做出选择,就必须始终如一地遵循它。

在 DBMS 级别设置限制

当使用数据库存储程序对象(例如客户或订单)时,明智的做法是null使用适当的表限制在 DBMS 级别指定对象的“性质”。数据库通常包含来自多个来源的信息,引入缺失值检查将提高数据的完整性。此外,在 DBMS 级别对 null 检查的存在将减少 Java 代码中的空值:通过将数据库中的数据加载到 Java 对象中,您可以确定它们的存在并!= null从程序代码中删除不必要的“”。

使用空对象模式

创建特殊Null对象是避免 Java 中 NullPointerExcpetion 的另一种方法。假设应用程序中的某些方法返回一个对象,程序随后通过调用其方法来使用该对象。例如,该方法返回用于迭代集合的Collection.iterator()类的对象。Iterator然后,如果原始对象没有任何迭代器,null您可以返回一个特殊的- 对象,该对象具有始终返回 的Null方法。亲爱的读者,这就是我关于消除 Java 程序 NullPointerException 错误的技巧的结束。您将体会到这些简单且不繁琐的规则是多么有用。提醒一下,如果您想分享 Java 程序中的任何其他 NullPointerException 技巧,请随时在评论中进行。 专门为 JavaRush 学生翻译。原来的hasNext()false
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION