📌  相关文章
📜  如何使用 Optional 类避免Java中的 NullPointerException?

📅  最后修改于: 2022-05-13 01:54:48.704000             🧑  作者: Mango

如何使用 Optional 类避免Java中的 NullPointerException?

为了学习如何避免错误,我们必须首先了解错误。

空指针异常

NullPointerException是一个 RuntimeException。在Java中,可以为对象引用分配一个特殊的 null 值。当程序尝试使用具有 null 值的对象引用时,将引发 NullPointerException。

这些可以是:

  • 从空对象调用方法。
  • 访问或修改空对象的字段。
  • 取null的长度,就好像它是一个数组一样。
  • 访问或修改空对象的槽,就像它是一个数组一样。
  • 抛出 null,就好像它是一个 Throwable 值。
  • 当您尝试通过空对象进行同步时。

例子:

// Java program to show NullPointerException
  
public class Example {
    public static void main(String[] args)
    {
  
        // Create a String of size 10
        String[] a = new String[10];
  
        // The String is empty
        // So a[1] will have null at present
        String upcase = a[1].toUpperCase();
  
        System.out.print(upcase);
    }
}

输出:

Exception in thread "main" java.lang.NullPointerException
    at Example.main(Example.java:4)

如何使用可选类避免 NullPointerException?:
Java 8 在Java.util 包中引入了一个新类 Optional。它可以帮助编写简洁的代码,而无需使用太多的空检查。通过使用 Optional,我们可以指定要返回的替代值或要运行的替代代码。这使得代码更具可读性,因为隐藏的事实现在对开发人员可见。

选修课
Optional 是可以包含非空值或空值的容器对象。它基本上检查内存地址是否有对象。如果存在值,isPresent() 将返回 true,而 get() 将返回该值。提供了依赖于包含值是否存在的其他方法,例如 orElse() 如果值不存在则返回默认值,如果值存在则执行代码块 ifPresent()。这是一个基于值的类,即它们的实例是:

  • 最终的和不可变的(尽管可能包含对可变对象的引用)。
  • 仅基于 equals() 被视为相等,而不是基于引用相等 (==)。
  • 没有可访问的构造函数。

    句法:

    Optional is a generic type of type T.
    
    Optional
    

    使用可选类纠正上述 NullPointerException 的代码:

    // Java program to avoid NullPointerException
    // using Optional Class
      
    import java.util.Optional;
      
    public class Example {
        public static void main(String[] args)
        {
      
            // Create a String of size 10
            String[] a = new String[10];
      
            // Create an Optional Class instance
            // and get the state for a[1] element
            // for Null value
            Optional check = Optional.ofNullable(a[1]);
      
            // If the value in the current instance is null,
            // it will return false, else true
            if (check.isPresent()) {
      
                // The String is empty
                // So a[1] will have null at present
                String upcase = a[1].toUpperCase();
                System.out.print(upcase);
            }
            else
      
                // As the current value is null
                System.out.println("String value is not present");
        }
    }
    
    输出:
    String value is not present
    

    注意:因此这可以理解为 NullPointerException 的异常处理方法

    使用 Optional 类处理 NullPointerException:

    // Java program to handle NullPointerException
    // using Optional Class
      
    import java.util.Optional;
      
    public class Example {
        public static void main(String[] args)
        {
      
            // Create a String of size 10
            String[] a = new String[10];
      
            // Define the a[1] element
            a[1] = "geeksforgeeks";
      
            // Create an Optional Class instance
            // and get the state for a[1] element
            // for Null value
            Optional check = Optional.ofNullable(a[1]);
      
            // If the value in the current instance is null,
            // it will return false, else true
            if (check.isPresent()) {
      
                // The String is not empty
                // So a[1] will have a value at present
                String upcase = a[1].toUpperCase();
                System.out.print(upcase);
            }
            else
      
                // If the current value is null
                System.out.println("String value is not present");
        }
    }
    
    输出:
    GEEKSFORGEEKS