package characterdrawing;
import java.util.*;
public class CharacterDrawing {
public static void main(String[] args) {
// TODO Auto-generated method stub
char c;
int n;
do {
try {
Scanner in=new Scanner(System.in);
System.out.println("Please input character:");
c=in.next().charAt(0);
System.out.println("Please input N:");
n=in.nextInt();
for (int i=1;i<=n;++i) {
for (int j=i;j>=1;--j) {
System.out.print(c+" ");
}
System.out.print("\n");
}
in.close();
}
catch(NoSuchElementException e) {
System.err.println(e);
System.exit(1);
}
}while (true);
}
}
如图,在eclipse执行程序并输入图中下方信息后,为什么这个java程序会抛出NoSuchElementException异常?应如何解决?
Scanner 不要定义在 循环里, 一轮循环 运行结束,把输入流关闭了, 导致下一次 new 出来的Scanner 无法从System.in 中获取数据
这里 in.next() 无法获取数据,自然报了 NoSuchElementException异常
改造【把 Scanner 提到 do-while 循环上面】
public static void main(String[] args) {
char c;
int n;
Scanner in=new Scanner(System.in);
do {
try {
System.out.println("Please input character:");
c=in.next().charAt(0);
System.out.println("Please input N:");
n=in.nextInt();
for (int i=1;i<=n;++i) {
for (int j=i;j>=1;--j) {
System.out.print(c+" ");
}
System.out.print("\n");
}
}
catch(NoSuchElementException e) {
e.printStackTrace();
break;
}
}while (true);
in.close();
}
没有这个种类的异常呗。直接用exception
in.next().charAt(0)这行,没输入值的话charAt会报错
Caused by: java.util.NoSuchElementException
根据参考资料,问题可能是由于在调用two()方法时,之前已经调用了one()方法并关闭了Scanner,导致在调用two()方法时无法从控制台获取输入。解决方法是可以在Test()方法中只使用一个Scanner对象,并在所有方法执行完毕后再关闭Scanner对象。以下是示例代码:
public class Test{
private Scanner in;
public Test(){
in = new Scanner(System.in);
one();
two();
three();
in.close();
}
public void one(){
int a=in.nextInt();
//...
}
public void two(){
int a=in.nextInt();
//...
}
public void three(){
int a=in.nextInt();
//...
}
}
以上代码中,在Test()方法中先创建一个Scanner对象,然后依次调用one()、two()、three()方法。在所有方法执行完毕后再关闭Scanner对象。这种方式可以避免多次创建Scanner对象导致的异常。