| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3772 人关注过本帖
标题:scan.nextInt()莫名报异常
只看楼主 加入收藏
步向巅峰
Rank: 5Rank: 5
来 自:河南
等 级:贵宾
威 望:17
帖 子:110
专家分:371
注 册:2013-4-26
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:11 
scan.nextInt()莫名报异常
部分代码:
        System.out.println("************信息管理************");
        Scanner scan=new Scanner(System.in);
        int chs=0;
        System.out.println("1-房间信息管理");
        System.out.println("2-房间类型管理");
        System.out.println("3-用户信息管理");
        System.out.println("4-退出");
        System.out.println("请选择:");
        chs=scan.nextInt();//为什么我还没输入,就出现异常,在什么情况下,会出现这种现象

部分运行结果:
************信息管理************
1-房间信息管理
2-房间类型管理
3-用户信息管理
4-退出
请选择:
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextInt(Scanner.java:2160)
    at java.util.Scanner.nextInt(Scanner.java:2119)
    at com.酒店管理系统.Client.mainPanel(Client.java:133)
    at com.酒店管理系统.Demo.main(Demo.java:30)
搜索更多相关主题的帖子: 信息 用户 
2014-10-05 17:49
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:0 
InputTestNG.java
程序代码:
import java.util.*;
// 先输入年龄,后输入姓名,结果是错误的示例

public class InputTestNG {

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

        System.out.print("How old are you? ");
        int age = in.nextInt();

        System.out.print("What is your name? ");
        String name = in.nextLine();

        System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
    }
}


InputTestOK_r0.java
程序代码:
// JAVA 2核心技术 卷I:基础知识
// Example 3-2. InputTest.java
// 先输入姓名,后输入年龄,结果是正确的示例

import java.util.*;

public class InputTestOK_r0 {

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

        System.out.print("What is your name? ");
        String name = in.nextLine();

        System.out.print("How old are you? ");
        int age = in.nextInt();

        System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
    }
}


InputTestOK_r1.java
程序代码:
// 先输入年龄,后输入姓名,修改后,结果是正确的示例,但不太完美

import java.util.*;

public class InputTestOK_r1 {

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

        System.out.print("How old are you? ");
        int age = in.nextInt();
        in.nextLine(); // 关键修改:额外追加一个读入回车符的操作

        System.out.print("What is your name? ");
        String name = in.nextLine();

        System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
    }
}


InputTestOK_r2.java
程序代码:
// 先输入年龄,后输入姓名,修改后,结果是正确的示例,应该是比较完美的解决办法

import java.util.*;

public class InputTestOK_r2 {

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

        System.out.print("How old are you? ");
        int age = Integer.valueOf(in.nextLine()); // 关键修改:统一使用nextLine

        System.out.print("What is your name? ");
        String name = in.nextLine();

        System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
    }
}
2014-10-05 22:56
步向巅峰
Rank: 5Rank: 5
来 自:河南
等 级:贵宾
威 望:17
帖 子:110
专家分:371
注 册:2013-4-26
收藏
得分:0 
谢了,大致明白了,不过能不能告诉我,这种现象是不是因为缓存,虽然老师告诉我java是没有缓存的,不过我知道C是有缓存的,而C是java的底层代码,然后我就迷惑了。因为现在遇到的情况和C中没有处理缓存的情况很相似,可是又不完全一样,至少感觉不到输出缓存的影响。
另外,对于接收到的回车符是怎么处理的,是去掉还是?
2014-10-06 16:54
步向巅峰
Rank: 5Rank: 5
来 自:河南
等 级:贵宾
威 望:17
帖 子:110
专家分:371
注 册:2013-4-26
收藏
得分:0 
对了,in用作变量没问题吗?
2014-10-06 17:10
步向巅峰
Rank: 5Rank: 5
来 自:河南
等 级:贵宾
威 望:17
帖 子:110
专家分:371
注 册:2013-4-26
收藏
得分:0 
对了,in用作变量没问题吗?
2014-10-06 17:21
步向巅峰
Rank: 5Rank: 5
来 自:河南
等 级:贵宾
威 望:17
帖 子:110
专家分:371
注 册:2013-4-26
收藏
得分:0 
不行,用你说的方法,我试了试,还不行,另外,换了个类封装,还是报同样的错误,可是把这一段重新放到一个新的包中就没事
************信息管理************
1-房间信息管理
2-房间类型管理
3-用户信息管理
4-退出
请选择:
Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1585)
    at com.酒店管理系统.MainPanel.mainPanel(MainPanel.java:20)
    at com.酒店管理系统.Demo.main(Demo.java:31)
2014-10-06 17:47
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:0 
如果有可能,粘贴出你整个类的代码,光看一段看不出来

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2014-10-06 20:56
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
这么一小段??

三十年河东,三十年河西,莫欺少年穷!
2014-10-07 15:52
步向巅峰
Rank: 5Rank: 5
来 自:河南
等 级:贵宾
威 望:17
帖 子:110
专家分:371
注 册:2013-4-26
收藏
得分:0 
package com.酒店管理系统;

public class Demo {
    public static void main(String[] args) {
        boolean isQuit=false;//是否退出
        Client c=new Client();
        MainPanel mp=new MainPanel();
        do
        {
            if(c.isLogin()==false)//未登陆
            {
                int res=0;
                res=c.loginPanel();    //登陆界面
                if(res==0)//登陆成功
                {
                    System.out.println(c.getUserName()+",欢迎你!");
                }
                else if(res==1)//登陆失败
                {
                    System.out.println("登陆失败3次,退出系统");
                    return;//未登陆时直接退出系统
                }
                else if(res==2)//退出系统
                {
                    System.out.println("再见!");
                    return;
                }
            }
            else//已登陆
            {
                isQuit=mp.mainPanel();
            }
        }while(!isQuit);
    }
}
package com.酒店管理系统;
import java.util.Random;
import java.util.Scanner;
public class Client {
    private String userName;
    private String password;
    private String securityCode;//验证码
    private boolean isLogin;//是否登陆
    public Client(){
        userName="admin";
        password="123456";
        this.setLogin(false);
    }
    public String getUserName(){
        return userName;
    }
    public void setLogin(boolean isLogin) {
        this.isLogin = isLogin;
    }
    public boolean isLogin(){
        return isLogin;
    }
    /**
     *登陆后的初始化(读取文件)
     */
    public void init(){
        
    }
    /**
     * 登陆界面
     * @return 0-登陆成功 1-登陆失败 2-退出系统 -1-操作有误
     */
    public int loginPanel(){
        System.out.println("**********酒店管理系统**********");
        Scanner scan=new Scanner(System.in);
        int chs=0;//选择
        System.out.print("1-登陆 2-退出/n请选择:");
        chs=Integer.valueOf(scan.nextLine());
        switch(chs){
        case 1:
            if(login()==true){//登陆成功
                this.setLogin(true);
                scan.close();
                return 0;
            }else{
                scan.close();
                return 1;
            }
        case 2:
            scan.close();
            return 2;
            default:
                System.out.println("输入有误");
                scan.close();
                return -1;
        }
    }
    /**
     * 登陆
     * @return true-登陆成功 false-登陆失败(失败3次)
     */
    private boolean login(){
        System.out.println("*************登陆*************");
        Scanner scan=new Scanner(System.in);
        String user="";
        String pwd="";
        String code="";//验证码,错误时自动更换
        int fail=0;
        
        while(!(user.equals(userName))){
            System.out.print("用户名:");
            user=scan.nextLine();
            if(!(user.equals(userName))){
                System.out.println("用户名不存在");
                fail++;
            }
            if(fail==3){
                scan.close();
                return false;
            }
        }
        while(!(pwd.equals(password))){
            System.out.print("密   码:");
            /**密码隐藏未完成**/
            pwd=scan.nextLine();
            if(!(password.equals(pwd.toString()))){
                System.out.println("密码错误");
                fail++;
            }
            if(fail==3){
                scan.close();
                return false;
            }
        }
        do{
            securityCode=security();//产生并更换验证码
            System.out.println("验证码:"+securityCode);
            System.out.print("请输入验证码:");
            code=scan.nextLine();
        }while(!code.equalsIgnoreCase(securityCode));
        scan.close();
        return true;
    }
    /**
     * 产生验证码
     * @return 成功返回生成的验证码,失败返回null
     */
    private String security(){
        char[] chr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
        Random random = new Random();
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            buffer.append(chr[random.nextInt(62)]);
        }
        return buffer.toString();
    }

}

package com.酒店管理系统;

import java.util.Scanner;

public class MainPanel {

    /**
     * 主界面
     * @return true-未退出 false-退出
     */
    public boolean mainPanel(){
        System.out.println("************信息管理************");
        Scanner scan=new Scanner(System.in);
        int chs=0;
        System.out.println("1-房间信息管理");
        System.out.println("2-房间类型管理");
        System.out.println("3-用户信息管理");
        System.out.println("4-退出");
        System.out.println("请选择:");
        chs=Integer.valueOf(scan.nextLine());
        switch(chs){
        case 1:
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            quit();
            scan.close();
            return true;//退出
            default:
                System.out.println("操作有误");
        }
        scan.close();
        return false;//默认未退出
    }
    /**
     * 退出(保存文件)
     */
    private void quit(){
        System.out.println("保存并退出");
    }
}

所有代码
2014-10-08 08:57
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:100 
细节的问题暂时还没有研究,感觉是多处使用new Scanner(System.in)造成的问题

下面是建议:
1)先用JOptionPane.showInputDialog改写一下程序
【示例:http://bbs.

如果OK了,继续参考下面的建议

2)用单例模式改写一下代码,使系统中仅有一个new Scanner(System.in)
【参考:http://baike.baidu.com/view/1859857.htm?fr=aladdin】
2014-10-08 22:20
快速回复:scan.nextInt()莫名报异常
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020812 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved