学java时间不长 碰到一问题 见以下大致代码......Scanner sc = new Scanner(System.in);
do{
    int a;
    ... ...
    a=sc.nextInt();
    ... ...
}while(...);......想利用nextInt()从键盘输入一个整数赋值给一整形变量
由于需要重复输入 将此方法调用放到do-while循环中 第一次能正确输入
而再次进入循环碰到此方法时出现异常如下:
Exception in thread "main" java.util.NoSuchElementException
        at java.util.Scanner.throwFor(Unknown Source)
        at java.util.Scanner.next(Unknown Source)
        at java.util.Scanner.nextInt(Unknown Source)
        at java.util.Scanner.nextInt(Unknown Source)
        at InputSystem.main(InputSystem.java:206)
通过看jdk帮助文档大概知此异常是因为什么枚举中没有更多的元素之类的有关系
不知怎样解决?
而且小弟为用java实现键盘输入一整形数值很迷茫 不知怎样才是最好的解决办法
想起学c时一个scanf就一切搞定 可到了java这感觉不是很容易
上面的方法也是请教别人的 请大家指点一下 在此谢过

解决方案 »

  1.   

    抛出这个NoSuchElementException异常,表示,没有这么多的元素了。
    就是,本来这时候不应该再执行的,而你while里居然判断为true,程序还继续执行,
    由于没有下一个int了,所以就抛出这个异常。例如,你输入:1 2 3
    本来执行到3时,就没有元素了,而你的while居然还是判断为true,所以,就抛这个异常了。
      

  2.   

    Scanner sc = new Scanner(System.in);
    do{
        if(sc.hasNext()){
        int a;
        ... ...    a=sc.nextInt();
        ... ...
    }while(...);......
      

  3.   

    刚才代码没写完,就发出去了。在读之前先判断下有没有输入,否则就一直等。Scanner sc = new Scanner(System.in);
    do{
        if(sc.hasNext()){
            int a;
            ... ...
            a=sc.nextInt();
            ... ...
        }
    }while(...);......
      

  4.   

    我按照楼上的方法写了一个简单的程序来试验 的确可以
    import java.util.Scanner;public class Test{

    public static void main(String args[]){

    Scanner sc = new Scanner(System.in);
    int a=0;
        do{
            System.out.println("Input a:");
            if(sc.hasNext()){
               a=sc.nextInt();
            System.out.println("a="+a);
             }
          }while(a!=0);
    }
    }
    但是我自己那个程序仍然不能正确运行 出现死循环 很是郁闷 应该还是跟这个问题有关系
    大家关于这个问题还有没有什么可指教的
    虽然我自己的问题没有解决 但确实也学到了东西
    准备再等等结贴 谢谢楼上
      

  5.   

    do while还不如改成while代码更简练
    while(sc.hasNext() && a != 0)
    {
    ……
    }
      

  6.   

    o~ 用do while循环是和编写的程序本身有关系
      

  7.   

    死循环是因为你的while后的条件问题,比如你认为输入回车就是结束的话,你的WHILE 就要写成下面的样子。总之你要用什么作为结束,就用什么作为判断的条件,否则当然是不停的循环了。import java.util.Scanner;public class Test{public static void main(String args[]){Scanner sc = new Scanner(System.in);
    int a=0;
        do{
            System.out.println("Input a:");
            if(sc.hasNext()){
               a=sc.nextInt();
            System.out.println("a="+a);
             }
          }while(a!=0 && a!=13);
    }
    }
      

  8.   

    谢谢楼上能又来看我这个贴
    我不明白为什么输入回车就是结束要用a!=0&&a!=13呢?
    还有 我程序里出现的死循环是第一遍结束后就进入不受控制的死循环只有强制中断才能停止
    但是我这个程序do-while循环里的内容和上面的试验程序里大体结构是一样 但是我那个程序就出现死循环 这个却能正常运行
    我是个大三学生 没有太多编程经验 用个java写个小小的程序来练习 碰到了很多问题 很多我问题我也自己解决了 可这个问题一直处理不了 请楼上多多指教啊
      

  9.   

    题目是这样的
    设计题目:模拟简单的信息录入系统。设计书、CD、磁带三个类,每个类含有名字、作者或演唱者、出版社或唱片社、价格、出版日期等相关信息。根据系统提示从键盘输入相关内容。
    设计要求:可以使用类似命令行的方式来实现。程序运行后提示用户可以执行的操作类型,并要求用户输入一种选择。根据用户的选择,提示用户输入相关的信息(根据不同选择,输入不同的信息),最后在屏幕上输出这些信息。
       可以使用循环来完成,以接受用户的多次输入。当用户选择退出,程序结束。对于不合要求的输入,给出提示,允许再重新输入。对于不同类型的输入信息,需要使用分支结构判别。目前的程序如下(由于正在写 所以很不完整 而且有不受控制的死循环的问题)import java.io.*;
    import java.util.Scanner;class MyMedia{

      /*private*/ String mediaName;       //出版物名称
      /*private*/String press;             //出版社(磁带发行商)
      /*private*/ String artist;             //作者(演唱者)
      /*private*/ String date; //出版日期
      /*private*/ String price;              //出版物价格
      
      
      void inputMediaName(){       //出版物名称输入成员函数
         
      }
      void inputMediaPrice(){     //价格输入成员函数
      
      }
      
      void inputMediaPress(){    //出版社(磁带发行商)输入成员函数
      
      }
      
      void inputArtist(){         //作者(演唱者)输入成员函数
      
      }
      void inputDate(){   //出版日期输入成员函数
      
      }
      
      void outputInf(){
         }
    }   
    class MyBook extends MyMedia{  MyBook(){
      
       super();
       }
      
      BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
      
      void inputMediaName(){       
      
      
       try{
       System.out.println("请输入图书书名:");
       

        this.mediaName=in.readLine();
    }catch(IOException e){}
      }
      
      
      
      void inputArtist(){
      
      
       try{
       System.out.println("请输入图书作者姓名:");
       

        this.artist=in.readLine();
     
    }catch(IOException e){}
      }
      
      
      void inputMediaPress(){
      
      
       try{
       System.out.println("请输入图书出版社:");
       

        this.press=in.readLine();
        
    }catch(IOException e){}
      }
      
      
      void inputDate(){
      
      
       try{
       System.out.println("请输入图书出版日期:");
       

        this.date=in.readLine();
        
    }catch(IOException e){}
      }
      
      
      void inputMediaPrice(){
      
      
       try{
       System.out.println("请输入图书价格:");
      
       this.price=in.readLine();
        in.close();
        }catch(IOException e){}
      }
      
      
      void outputInf(){
      
        System.out.println("已经输入的图书信息如下:");
        System.out.println("书名:"+mediaName);
        System.out.println("作者:"+artist);
        System.out.println("出版社:"+press+"出版社");
        System.out.println("出版日期:"+date);
        System.out.println("价格:"+price+"元");
      }
      
    }
    class MyCD extends MyMedia{

    MyCD(){
      
       super();
       }

    void inputMediaName(){       
      
       BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
      
       System.out.println("请输入唱片名:");
       
        try{

        this.mediaName=in.readLine();
        
        in.close();

          }catch(IOException e){}
      }
      
      void outputInf(){
      
        System.out.println("已经输入的唱片信息如下:");
        System.out.println("唱片名:"+mediaName);
      }
    }
    class MyTape extends MyMedia{

    MyTape(){
      
       super();
       }

    void inputMediaName(){       
      
       BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
      
       System.out.println("请输入磁带名:");
       
        try{

        this.mediaName=in.readLine();
        
        in.close();

          }catch(IOException e){}
      }
      
      void outputInf(){
      
        System.out.println("已经输入的磁带信息如下:");
        System.out.println("磁带名:"+mediaName);
      }
    }
    public class InputSystem{

    public static void main(String args[]){
                  
    Scanner sc = new Scanner(System.in);
    int selectNum=0;

    do{

      System.out.println("请选择要录入信息的媒体类型,输入相应类型前的序号:");
      System.out.println("1. 图书");
      System.out.println("2. CD");
      System.out.println("3. 磁带");
      System.out.println("0. 退出");   if(sc.hasNext()){
    selectNum=sc.nextInt();


      while (selectNum<0 || selectNum>3){

      System.out.println("输入序号有误,请重新输入:");


      selectNum=sc.nextInt();
           }
      
     switch(selectNum){
     
       case 1:{
       
        MyBook book=new MyBook();
       
        book.inputMediaName();
        book.inputArtist();
        book.inputMediaPress();
        book.inputDate();
        book.inputMediaPrice();
        book.outputInf();
        
        break; 
       }
       
       case 2:{
       
        MyCD cd=new MyCD();
       
        cd.inputMediaName();
        cd.outputInf();
        cd.inputMediaPress();
        cd.inputDate();
        cd.inputMediaPrice();
        cd.outputInf(); 
       
        break; 
       }
       
       case 3:{
       
        MyTape tape=new MyTape();
       
        tape.inputMediaName();
        tape.outputInf();
        tape.inputMediaPress();
        tape.inputDate();
        tape.inputMediaPrice();
        tape.outputInf();
        
        break; 
       }
       
       case 0: break;
     }
    }
    }while(selectNum!=0);

    System.out.println("已退出输入");

    }
    }大家给指点一下 除了这个问题我在写程序的思路和规范上有什么不妥的也请大家批评指正 谢谢大家了