我在我的代码中写了这行(String str = sc.next();)10次,并且所有这些都正常工作,除了一个不等待我的输入并立即抛出异常“java。 util.NoSuchElementException“! 有没有人知道为什么会发生这种情况?
private static Matrix GetRationalMatrix(int[] size) throws Exception {
Scanner sc = new Scanner(System.in);
MathVector[] matrix = new MathVector[size[0]];
for(int i = 0 ; i < size[0] ; i++) {
MathVector vector = null;
String str = sc.nextLine();
str = str.replaceAll("[ \t]+", " ");
String[] splitStr = str.split(" ");
Scalar[] scalarVector = new Scalar[size[1]];
for(int j = 0 ; j < splitStr.length ; j++) {
String[] tmp = splitStr[j].split("/");
try {
scalarVector[j] = new Rational(Integer.parseInt(tmp[0]), Integer.parseInt(tmp[1]));
}
catch(Exception e){
sc.close();
throw new Exception("Please enter values properly: a/b were a,b are integers!");
}
}
vector = new MathVector(size[1], scalarVector);
matrix[i] = new MathVector(vector);
}
Matrix ans = new Matrix(size[0], matrix);
sc.close();
return ans;
}
in size [0]行数和大小[1]列数,都是正整数
答案 0 :(得分:0)
nextLine(
)而不是next();
hasNext和next方法都可能阻止等待进一步输入。 hasNext方法块是否与其关联的下一个方法是否会阻塞无关。
答案 1 :(得分:0)
如果您以前使用过
Scanner sc = new Scanner(System.in);
在try-with-resources中或自己关闭Scanner
,这将关闭基础System.in
流。在这种情况下,尝试通过Scanner
再次阅读它会导致NoSuchElementException
。
请勿关闭System.in
并尝试重复使用相同的Scanner
对象。
答案 2 :(得分:0)
hasNext()
的javadoc指定:
如果此扫描器的输入中有另一个标记,则返回true。在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入。
next()
的javadoc指定:
查找并返回此扫描仪的下一个完整令牌。在完成令牌之前和之后是与分隔符模式匹配的输入。即使之前的hasNext()调用返回true,此方法也可能在等待输入扫描时阻塞。
不意味着next()
将始终阻止,但它可能会阻止,例如它是否在等待令牌的 end ,因为它承诺从输入中返回下一个完整的标记。检查输入是否包含另一个令牌是一个完全不同的操作,由hasNext()
执行,这将阻止因为它将等待输入(直到找到EOF)。
所以我认为你得到NoSuchElementException
是因为你使用next()
不当。
答案 3 :(得分:0)
java.util.NoSuchElementException是一个RuntimeException,它可以被Java中的不同类抛出,如Iterator,Enumerator,Scanner或StringTokenizer。如果底层数据结构没有任何元素Java抛出“java.util.NoSuchElementException”,那么所有这些类都有获取下一个元素或下一个标记的方法。
你可以在我们的代码中使用字符串标记器..
StringTokenizer st = new StringTokenizer(sc);
你可以使用hasMoretokens()方法....所以只要你提供的输入有更多的标记就会返回true .....
如果你想得到下一个标记你可以nextToken()方法...