黑马程序员技术交流社区

标题: 学java第5天了,写了个双色球的,但是会出现空指针异常,求 [打印本页]

作者: app297    时间: 2014-2-27 00:32
标题: 学java第5天了,写了个双色球的,但是会出现空指针异常,求
本帖最后由 app297 于 2014-2-27 00:35 编辑

今天是在传智上课第5天了, 老师讲了一个双色球的,数组算法,但是回来后,自己把功能一扩展,
大部分时间会出现 空指针异常。偶尔程序会正常运行,希望大家能帮忙看看到底是 数组排序那一块什么地方出问题了。

源码我上传到附件,希望有人能下载帮我看一看 DualColoredBall.zip (1.39 KB, 下载次数: 882)
代码里面有换行符。大家还是直接下载源码 帮我看看吧


  1. <P>/**
  2. 需求:在控制台模拟双色球开奖和 单一的 投注
  3. 思路:
  4. 1、先编写生成 双色球元素 和 自动摇号开奖的 号码红蓝组合
  5. 2、接收用户输入的 单式投注。(功能扩展,加入机选注下注)
  6. 3、对比结果。并开奖

  7. */
  8. import java.util.*;</P>
  9. <P>class DualColoredBall {
  10. public static void main(String[] args) {
  11.   System.out.println("=========== 双色球下注界面 =======\n");
  12.   String[] dcb = new String[7];
  13.   Scanner sr = new Scanner(System.in);
  14.   System.out.println("请输入01~33之间的6个红球(每次输入一个):");
  15.   for (int x = 0; x < 6; x++) {
  16.    System.out.print("第" + (x + 1) + "个红球:");
  17.    String temp = sr.next();
  18.    dcb[x] = temp;
  19.   }
  20.   // 排序之后,再和 开奖号码对比
  21.   arraySort(dcb);
  22.   // 加上篮球
  23.   System.out.print("请输入篮球(01~16):");
  24.   dcb[6] = sr.next();
  25.   // 调用开奖号码
  26.   String[] dcbOpen = dCBallOpen();</P>
  27. <P>  System.out.print("\n开奖号码:" + Arrays.toString(dcbOpen));
  28.   System.out.print("\n您的号码:" + Arrays.toString(dcb));
  29. }</P>
  30. <P> public static String[] dCBallOpen() {
  31.   String[] dcb = { "01", "02", "03", "04", "05", "06", "07", "08", "09" };
  32.   String[] dbc2 = Arrays.copyOf(dcb, 33); // 创建双色球 33个号码数组
  33.   // 生成null的双色球数字
  34.   for (int i = 9; i < dbc2.length; i++) {
  35.    dbc2[i] = i + "";
  36.   }
  37.   // 随机生成开奖
  38.   String[] newDbc = new String[7]; // 存储随机生成的6 + 1 红蓝球
  39.   // 随机去重复。 就要想到 旗标对应法
  40.   boolean[] flags = new boolean[33];
  41.   Random r = new Random();
  42.   for (int count = 0; count < 6; count++) {
  43.    int index = r.nextInt(33);
  44.    if (!flags[index]) {
  45.     newDbc[count] = dbc2[index];
  46.     flags[index] = true;
  47.    }
  48.   }
  49.   // 先排序,再返回
  50.   arraySort(newDbc);
  51.   newDbc[6] = dbc2[r.nextInt(16)];// 添加蓝球 到末尾
  52.   return newDbc;</P>
  53. <P> }</P>
  54. <P> /**
  55.   * 数组 选择排序,从小到大。
  56.   */
  57. public static void arraySort(String[] arr) {
  58.   // 在处理的时候,把字符串元素转换成 int 然后才能比较
  59.   // 选择排序,从第一个开始,挨个的同后面的对比
  60.   for (int i = 0; i < arr.length - 2; i++) { // 因为自己不和自己比,还有就是只排序前5位,最后一位是篮球,不用排
  61.    for (int j = i + 1; j < arr.length - 1; j++) {
  62.     int num1 = Integer.parseInt(arr[i]); // 把该角标位置的字符串转成int类型
  63.     int num2 = Integer.parseInt(arr[j]);
  64.     if (num1 > num2) {
  65.      String temp = arr[i];// 同理,交换数组位置
  66.      arr[i] = arr[j];
  67.      arr[j] = temp;
  68.     }
  69.    }
  70.   }
  71. }
  72. }
  73. </P>
复制代码

作者: app297    时间: 2014-2-27 00:55
看错了。不是空指针异常。反正就是会出现一个异常。然后程序就崩溃了
作者: yunzhongzhuhuo    时间: 2014-2-27 08:17
方法dCBallOpen()中,在第44-49行代码中,可能会出现相同的随机数,然后那个count索引的newDbc[count]不会被赋值,就会出现值为null的情况,所以就会出行NumberFormatException

解决:
  1. for (int count = 0; count < 6; count++) {
  2.                         int index = r.nextInt(33);
  3.                        
  4.                         if (!flags[index]) {
  5.                                 newDbc[count] = dbc2[index];
  6.                                 flags[index] = true;
  7.                         }
  8.                         else{
  9.                                 count--;
  10.                                 continue;
  11.                         }
  12.                        
  13.                 }
复制代码

作者: 薛旻    时间: 2014-2-27 10:31
里面有几点小错误,最严重的如楼上所说,一旦标记出现重复的数值时,就把这个值舍弃,然后数组又往后走了,字符串数组就出现了默认值null,我改了下代码。
  1. int count = 0;
  2.                 while(count < 6) {
  3.                         int index = r.nextInt(33);
  4.                         if (!flags[index]) {
  5.                                 newDbc[count] = dbc2[index];
  6.                                 flags[index] = true;
  7.                                 count++;
  8.                         }else {
  9.                                 continue;
  10.                         }
  11.                 }
复制代码

还有些小问题就是创建1-33数组时,你忘了加1,存入了两个9,没有33
  1. // 生成null的双色球数字
  2.                 for (int i = 9; i < dbc2.length; i++) {
  3.                         dbc2[i] = i + 1 + "";
  4.                 }
复制代码

还有就是随机数生成的问题,该好好思考一下,nextInt(33) 生成的是0-32的值

希望对你有帮助



作者: 下雨了    时间: 2014-2-27 10:59
楼主挺强就吗  如果是之前没有接触过java 学5天能自己写出来这个已经很不错了。
作者: app297    时间: 2014-3-3 22:24
薛旻 发表于 2014-2-27 10:31
里面有几点小错误,最严重的如楼上所说,一旦标记出现重复的数值时,就把这个值舍弃,然后数组又往后走了, ...

不好意思。 下课太晚。 没时间上论坛。 解决了。   你说的这几点确实存在,第二天 讨论了下, 就没有异常了。 也扩充了。  机选多注,然后对比
作者: 黑马昊昊    时间: 2015-12-1 16:57
表示看不懂啊            
作者: 33期1113刘传政    时间: 2015-12-8 21:32
学了5天就会写成这样了?楼主好强
作者: jiangyu    时间: 2017-1-19 00:19
学习中!!!!!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2