我在这里犯错了吗?
Optional.empty线程“主”中的异常 java.lang.IllegalStateException:在处为NULL flagctf.IsItTheFlag.lambda $ 2(IsItTheFlag.java:28)在 java.util.Optional.orElseThrow(Optional.java:290)在 flagctf.IsItTheFlag.main(IsItTheFlag.java:28)
public class IsItTheFlag {
private static boolean isFlag(String str) {
return str.hashCode() == 1471587914 && str.toLowerCase().hashCode() == 1472541258;
}
public static void main(String[] args) {
String TheFlag = "------";
Stream<String> aStream = Stream.empty();
for (int i = 0; i < TheFlag.length(); i++) {
aStream = aStream.flatMap(IsItTheFlag::word);
}
Optional<String> stringStream = aStream
.parallel()
.filter(IsItTheFlag::isFlag)
.findAny();
System.out.println(stringStream);
String flag = stringStream.orElseThrow(() -> new IllegalStateException("NULL"));
if (isFlag(flag))
System.out.println("You found it!");
else
System.out.println("Try again :(");
}
private static Stream<Character> letters() {
Stream<Character> from_a_to_z = IntStream.range((int) 'a', 1 + (int) 'z').mapToObj(x -> (char) x);
Stream<Character> from_A_to_Z = IntStream.range((int) 'A', 1 + (int) 'Z').mapToObj(x -> (char) x);
Stream<Character> from_0_to_9 = IntStream.range((int) 'A', 1 + (int) 'Z').mapToObj(x -> (char) x);
return Stream.concat(
Stream.concat(from_a_to_z, from_A_to_Z),
from_0_to_9);
}
private static Stream<String> word(String prefix) {
return letters().map(x -> prefix + x);
}
}
答案 0 :(得分:1)
您在空流aStream
上调用此处理管道,这会导致空的Optional。
aStream.parallel().filter(IsItTheFlag::isFlag).findAny();
由于Optional
中的值为空,因此引发此异常。
stringStream.orElseThrow(() -> new IllegalStateException("NULL"))
答案 1 :(得分:0)
此位:
str.hashCode() == 1471587914 && str.toLowerCase().hashCode() == 1472541258;
可恶。字符串是Java中的排序值类型,因此,如果您有两个都是“喵”的字符串,则很有可能它们占据相同的内存空间,因此具有相同的hashcode()
。但是,如果使用该字符串的toLowerCase()
,则会得到一个新的不同的字符串,并且很有可能会使用不同的哈希码。
问题是,您到底想用那条线实现什么?