在本教程中,学习如何解决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 错误。