java程序抛出异常

img


程序代码:


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异常

img

img

改造【把 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会报错

  • 这篇博客: Java java.util.NoSuchElementException问题解决中的 问题描述: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Caused by: java.util.NoSuchElementException

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料,问题可能是由于在调用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对象导致的异常。