A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于陈 中级黑马   /  2012-5-10 12:28  /  2245 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /**
  2. * 作者:于陈
  3. * 功能:ArrayList演示职员添加与删除
  4. * 时间:2012年5月7日 16:42:26
  5. */
  6. package com.jihe;

  7. import java.util.*;

  8. public class Demo1 {

  9.         public static void main(String[] args) {
  10.                 ClerkManage clerkmanage = new ClerkManage();
  11.                 jiemian(clerkmanage);
  12.         }

  13.         // 简单界面方法
  14.         private static void jiemian(ClerkManage clerkmanage) {
  15.                 Scanner rd = new Scanner(System.in);

  16.                 while (true) {
  17.                         System.out.println("欢迎进入员工管理系统,请选择你需要的操作:");
  18.                         System.out.println("添加员工请按 1:");
  19.                         System.out.println("查找员工请按 2:");
  20.                         System.out.println("修改工资请按 3:");
  21.                         System.out.println("显示所有员工信息请按 4:");
  22.                         System.out.println("删除员工请按 5:");
  23.                         System.out.println("退出系统请按 0:");

  24.                         int Input = Integer.parseInt(rd.nextLine());
  25.                         if (Input == 1) {
  26.                                 System.out.println("请输入员工号");
  27.                                 int num = Integer.parseInt(rd.nextLine());
  28.                                 // int num=rd.nextInt();
  29.                                 System.out.println("请输入员工姓名");
  30.                                 String name = rd.nextLine();

  31.                                 System.out.println("请输入员工工资");
  32.                                 float sal = Float.parseFloat(rd.nextLine());
  33.                                 // float sal=rd.nextFloat();
  34.                                 Clerk clerk = new Clerk(name, num, sal);
  35.                                 clerkmanage.addClerk(clerk);
  36.                         } else if (Input == 2) {
  37.                                 System.out.println("请输入员工号");
  38.                                 int num = Integer.parseInt(rd.nextLine());
  39.                                 // //int num=rd.nextInt();
  40.                                 clerkmanage.showInfo(num);
  41.                         } else if (Input == 3) {
  42.                                 System.out.println("请输入员工号");
  43.                                 int num = Integer.parseInt(rd.nextLine());
  44.                                 // //int num=rd.nextInt();
  45.                                 System.out.println("请输入员工新工资");
  46.                                 float sal = Float.parseFloat(rd.nextLine());
  47.                                 // float sal=rd.nextFloat();
  48.                                 clerkmanage.updateSal(num, sal);

  49.                         } else if (Input == 4) {
  50.                                 clerkmanage.showAll();
  51.                         } else if (Input == 5) {
  52.                                 System.out.println("请输入员工号");
  53.                                 int num = Integer.parseInt(rd.nextLine());
  54.                                 // int num=rd.nextInt();
  55.                                 clerkmanage.deleteClerk(num);
  56.                         } else if (Input == 0) {
  57.                                 System.exit(0);
  58.                         }
  59.                 }
  60.         }

  61. }

  62. // 雇员类
  63. class Clerk {
  64.         public Clerk(String name, int num, float sal) {
  65.                 this.name = name;// 名字
  66.                 this.num = num;// 员工号
  67.                 this.sal = sal;// 薪水
  68.         }

  69.         private String name;
  70.         private int num;
  71.         private float sal;

  72.         public String getName() {
  73.                 return name;
  74.         }

  75.         public void setName(String name) {
  76.                 this.name = name;
  77.         }

  78.         public int getNum() {
  79.                 return num;
  80.         }

  81.         public void setNum(int num) {
  82.                 this.num = num;
  83.         }

  84.         public float getSal() {
  85.                 return sal;
  86.         }

  87.         public void setSal(float sal) {
  88.                 this.sal = sal;
  89.         }

  90. }

  91. // 员工管理类
  92. class ClerkManage {
  93.         // 创建ArrayList
  94.         @SuppressWarnings("unchecked")
  95.         private ArrayList a1 = null;

  96.         // 构造函数
  97.         @SuppressWarnings("unchecked")
  98.         public ClerkManage() {
  99.                 a1 = new ArrayList();
  100.         }

  101.         // 添加员工方法
  102.         @SuppressWarnings("unchecked")
  103.         public void addClerk(Clerk clerk) {
  104.                 a1.add(clerk);
  105.         }

  106.         // 查找一个员工
  107.         public void showInfo(int num) {
  108.                 // 遍历
  109.                 for (int i = 0; i < a1.size(); i++) {
  110.                         Clerk temp = (Clerk) a1.get(i);
  111.                         if (temp.getNum() == num) {
  112.                                 System.out.println("找到该员工!他的信息是: ");
  113.                                 System.out.println("姓名:" + temp.getName());
  114.                                 System.out.println("员工号:" + num);
  115.                                 System.out.println("薪水:" + temp.getSal());
  116.                         }
  117.                 }
  118.         }

  119.         // 修改员工薪水
  120.         public void updateSal(int num, float newSal) {
  121.                 // 遍历
  122.                 for (int i = 0; i < a1.size(); i++) {
  123.                         Clerk temp = (Clerk) a1.get(i);
  124.                         if (temp.getNum() == num) {
  125.                                 temp.setSal(newSal);
  126.                         }
  127.                 }
  128.         }

  129.         // 显示所有员工信息
  130.         public void showAll() {
  131.                 // 遍历
  132.                 for (int i = 0; i < a1.size(); i++) {
  133.                         Clerk temp = (Clerk) a1.get(i);
  134.                         System.out.println("员工号:" + temp.getNum() + " 姓名" + temp.getName()
  135.                                         + " 薪水:" + temp.getSal());
  136.                 }
  137.         }

  138.         // 删除员工
  139.         public void deleteClerk(int num) {
  140.                 // 遍历
  141.                 for (int i = 0; i < a1.size(); i++) {
  142.                         Clerk temp = (Clerk) a1.get(i);
  143.                         if (temp.getNum() == num) {
  144.                                 a1.remove(i);
  145.                         }
  146.                 }

  147.         }
  148. }
复制代码
为什么把输入改成下面注释的代码后就会出现异常呢???求指导,求大神包养......~~

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
注释的代码在哪块?
回复 使用道具 举报
本帖最后由 小小企鹅 于 2012-10-27 22:32 编辑

private static void jiemian(ClerkManage clerkmanage) {
                Scanner rd = new Scanner(System.in);

                while (true) {
                        System.out.println("欢迎进入员工管理系统,请选择你需要的操作:");
                        System.out.println("添加员工请按 1:");
                        System.out.println("查找员工请按 2:");
                        System.out.println("修改工资请按 3:");
                        System.out.println("显示所有员工信息请按 4:");
                        System.out.println("删除员工请按 5:");
                        System.out.println("退出系统请按 0:");
                        
                        int Input = Integer.parseInt(rd.nextInt());
                        if (Input == 1) {
                                System.out.println("请输入员工号");
                                int num=rd.nextInt();
                                System.out.println("请输入员工姓名");
                                String name = rd.next();
                                System.out.println("请输入员工工资");
                                float sal=rd.nextFloat();
                                Clerk clerk = new Clerk(name, num, sal);
                                clerkmanage.addClerk(clerk);
                        } else if (Input == 2) {
                                System.out.println("请输入员工号");
                                int num=rd.nextInt();
                                clerkmanage.showInfo(num);
                        } else if (Input == 3) {
                                System.out.println("请输入员工号");
                                int num=rd.nextInt();
                                System.out.println("请输入员工新工资");
                                float sal = Float.parseFloat(rd.nextLine());
                                clerkmanage.updateSal(num, sal);

                        } else if (Input == 4) {
                                clerkmanage.showAll();
                        } else if (Input == 5) {
                                System.out.println("请输入员工号");
                                int num=rd.nextInt();
                                clerkmanage.deleteClerk(num);
                        } else if (Input == 0) {
                                System.exit(0);
                        }
                }
        }
回复 使用道具 举报
int Input = Integer.parseInt(rd.next());//试想一下程序会把一个回车转换成为一个int类型的吗

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
云惟桉 发表于 2012-5-10 12:42
注释的代码在哪块?

   // int num=rd.nextInt();
  // float sal=rd.nextFloat();
回复 使用道具 举报
Scanner是SDK1.5新增的一个类,可是使用该类创建一个对象.
Scanner reader=new Scanner(System.in);
然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型: next.Byte(),nextDouble(),nextFloat,nextInt(),nextLin(),nextLong(),nextShot()
上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.例如,拥护在键盘输入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false. NextLine()等待用户输入一个文本行并且回车,该方法得到一个String类型的数据。
下面是一个实例:


import java.util.*;
public class Example{
public static void main(String args[]){
System.out.println("请输入若干个数,每输入一个数用回车确认");
System.out.println("最后输入一个非数字结束输入操作");
Scanner reader=new Scanner(System.in);
double sum=0;
int m=0;
while(reader.hasNextDouble()){
    double x=reader.nextDouble();
    m=m+1;
    sum=sum+x;
}
System.out.printf("%d个数的和为%f/n",m,sum);
System.out.printf("%d个数的平均值是%f/n",m,sum/m);
}
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
三楼和五楼都说到了楼主提问的重点了,我这里大概概括一下吧。

如五楼的同学所言,这些nextInt等的方法都是阻塞式的,但是你可以查看一下API里的解释:
nextInt:
将输入信息的下一个标记扫描为一个 int。如果下一个标记不能转换为有效的 int 值,则此方法将抛出 InputMismatchException,如下所述。
如果此转换成功,则扫描器执行匹配的输入。

因为楼主输入一行后有一个行终止符,也就是换行,是和一行中的int类型数据作为一个单词一起被标记为int。
但实际上换行符不能转换成int,所以应该就抛出异常了吧。
以上是我的想法,但还没时间去把代码检验一遍,希望能帮助楼主解决问题!

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
于陈 中级黑马 2012-5-10 19:43:00
8#
云惟桉 发表于 2012-5-10 18:56
三楼和五楼都说到了楼主提问的重点了,我这里大概概括一下吧。

如五楼的同学所言,这些nextInt等的方法都 ...

嗯嗯~好像有理解了~刚自己看了下API文档,把Scanner的几个方法都看了下~发现好像nextInt(),nextLine(),next(),nextFloat()在读取输入时候的一些特点~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马