今天在敲代码的时候遇到了NoSuchElementException异常,这个异常是我第一次遇到,非常的陌生,于是我打算记录下我的解决过程。
NoSuchElementException异常
NoSuchElementException:没有这样的元素异常。
这是机翻的结果。当我看到这翻译时有点懵,于是我立马问了度娘。这个异常应该是说定位不到这样的元素,也就是找不到这样的元素。
出现问题的地方
我要实现的功能需要多次用到从控制台扫描。于是我就在每个需要用到的方法中都new了一个Scanner,并在方法结尾关闭了Sanner。
public void one(){
Scanner in=new Scanner(System.in);
int a=in.nextInt();
...
in.close();
}
public void two(){
Scanner in=new Scanner(System.in);
int a=in.nextInt();
...
in.close();
}
public void three(){
Scanner in=new Scanner(System.in);
int a=in.nextInt();
...
in.close();
}
public Test(){
one();
two();
three();
}
//代码大致是这样的,在用到one()时没有出问题,
//但在接下来的two()的in,nextInt()却报了这个异常。
我的思路是我用到一次就new一个Scanner,然后在用完后就关闭,直到下次用到时在重新new一次,然后在关闭。这样应该是不会出问题,至少在我思路中是不会出问题的。
但实际运行时却报了这个异常。
解决方法
我在度娘上看了别人在迭代中出现这个异常的解决方法,于是我大致知道问题出在哪里了。问题应该是出在我的多次new Scanner和close上,上一个方法把Scanner 给close了,下一个方法中的new应该是没有执行,或者是执行了但立马关闭了,于是导致接下来的in.nextInt();找不到in,但在编译中因为我确实new了一个Scanner,所以在编译时没有报错,但运行时出了问题。
我把代码修改为这样后就成功实现了我的功能。
public void one(Scanner in){
int a=in.nextInt();
...
}
public void two(Scanner in){
int a=in.nextInt();
...
}
public void three(Scanner in){
int a=in.nextInt();
...
}
public Test(){
Scanner in=new Scanner(System.in);
one(in);
two(in);
three(in);
in.close();
}