多种方法解决java.util.NoSuchElementException:java.util.NoSuchElementException: No value present error in java

4,113 阅读2分钟

在本教程中,学习如何解决java.util.NoSuchElementException。在java应用程序中没有值存在的错误。

这个错误就是java.util.NoSuchElementException。当在java8中使用Stream API的Optional对象中没有发现任何元素时,会抛出No value present的错误。

让我们创建一个数组并以字符串值初始化。你可以查看如何在一行中创建和初始化一个数组

让我们看看一个简单的例子,检查一个字符串是否存在于数组中。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List srs = new ArrayList<>(Arrays.asList("One", "two", "three"));
        String str=srs.stream().filter(e->e.equals("ten")).findFirst().get();


    }
}

在线程 "main "中抛出一个错误的Exception java.util.NoSuchElementException。没有值存在

Exception in thread "main" java.util.NoSuchElementException: No value present
	at java.util.Optional.get(Optional.java:135)
	at Test.main(Test.java:8)

让我们来理解上述代码

  • 在java8中使用stream API对数组进行迭代,Stream是另一种迭代枚举对象的方式,可以提高性能。
  • 它使用stream()方法返回Stream对象
  • 在stream上调用过滤方法,该方法与给定的谓词相匹配,并通过stream返回匹配的值。
  • 使用findFirst从匹配的流中调用第一个元素并返回Optional类
  • 如果optional 对象是空的,get 方法返回no value present 错误,即Optional.get()方法在Optional对象为空时给出java.util.NoSuchElementException。

下面是一个在java8中实现的get方法

 public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

我们有多种方法来检查可选对象是否为空。

让我们看看其他一些简单的例子来重现和解决这个错误

Optional number1  =  Optional.of(123);
Optional number2  =  Optional.empty();
System.out.println(number1.get()); // 123
System.out.println(number2.get()); // Exception in thread "main" java.util.NoSuchElementException: No value present

一种方法:

我们可以使用Optional类中的isPresent()方法检查Optional是否为空。

        if (number2.isPresent()){
            System.out.println(number2.get());
    }else{
            System.out.println("number2 is an empty");
        }

isPresent()如果值存在,方法返回true ,否则返回false

这样我们就可以避免一个错误。

另一种方法是使用orElse 方法

orElse 如果Optional是空的,该方法返回与参数一起分配的默认值,否则,返回Optional类中存在的值。

Optional number1 = Optional.of(123);
System.out.println(number1.orElse(0)); // 123
Optional number2 = Optional.empty();
System.out.println(number2.orElse(0));

最后,你可以使用orElseThrow方法

有些时候,如果Optional是空的,我们想抛出一个错误,这很方便,很有帮助。

        Optional number1 = Optional.of(123);
        System.out.println(number1.orElse(0)); // 123
        Optional number2 = Optional.empty();
        System.out.println(number2.orElseThrow(Exception::new));

我们可以使用带有默认值的orElse或orElseThrow方法。

如何解决java8流中的NoSuchElement错误?

这里有一个完整的例子来避免java8流中的错误。

这通常发生在使用map,filter 等方法的流过程中。

我们必须使用orElse 返回指定的默认值,否则返回值存在于Optional类中。

import java.util.List;
import java.util.Optional;

public class Test {
    public static void main(String[] args)  throws Exception{
        List srs = new ArrayList<>(Arrays.asList("one", "two", "three"));
        String result=srs.stream().filter(e->e.equals("ten")).findFirst().orElse("");
        System.out.println(result);
        String result1=srs.stream().filter(e->e.equals("one")).findFirst().orElse("");
        System.out.println(result1);


    }
}

总结

你学到了多种方法来解决java8流中的java.util.NoSuchElementException: No value present 错误。