黑马程序员技术交流社区
标题:
学java第5天了,写了个双色球的,但是会出现空指针异常,求
[打印本页]
作者:
app297
时间:
2014-2-27 00:32
标题:
学java第5天了,写了个双色球的,但是会出现空指针异常,求
本帖最后由 app297 于 2014-2-27 00:35 编辑
今天是在传智上课第5天了, 老师讲了一个双色球的,数组算法,但是回来后,自己把功能一扩展,
大部分时间会出现 空指针异常。偶尔程序会正常运行,希望大家能帮忙看看到底是 数组排序那一块什么地方出问题了。
源码我上传到附件,希望有人能下载帮我看一看
DualColoredBall.zip
(1.39 KB, 下载次数: 882)
2014-2-27 00:30 上传
点击文件名下载附件
代码里面有换行符。大家还是直接下载源码 帮我看看吧
<P>/**
需求:在控制台模拟双色球开奖和 单一的 投注
思路:
1、先编写生成 双色球元素 和 自动摇号开奖的 号码红蓝组合
2、接收用户输入的 单式投注。(功能扩展,加入机选注下注)
3、对比结果。并开奖
*/
import java.util.*;</P>
<P>class DualColoredBall {
public static void main(String[] args) {
System.out.println("=========== 双色球下注界面 =======\n");
String[] dcb = new String[7];
Scanner sr = new Scanner(System.in);
System.out.println("请输入01~33之间的6个红球(每次输入一个):");
for (int x = 0; x < 6; x++) {
System.out.print("第" + (x + 1) + "个红球:");
String temp = sr.next();
dcb[x] = temp;
}
// 排序之后,再和 开奖号码对比
arraySort(dcb);
// 加上篮球
System.out.print("请输入篮球(01~16):");
dcb[6] = sr.next();
// 调用开奖号码
String[] dcbOpen = dCBallOpen();</P>
<P> System.out.print("\n开奖号码:" + Arrays.toString(dcbOpen));
System.out.print("\n您的号码:" + Arrays.toString(dcb));
}</P>
<P> public static String[] dCBallOpen() {
String[] dcb = { "01", "02", "03", "04", "05", "06", "07", "08", "09" };
String[] dbc2 = Arrays.copyOf(dcb, 33); // 创建双色球 33个号码数组
// 生成null的双色球数字
for (int i = 9; i < dbc2.length; i++) {
dbc2[i] = i + "";
}
// 随机生成开奖
String[] newDbc = new String[7]; // 存储随机生成的6 + 1 红蓝球
// 随机去重复。 就要想到 旗标对应法
boolean[] flags = new boolean[33];
Random r = new Random();
for (int count = 0; count < 6; count++) {
int index = r.nextInt(33);
if (!flags[index]) {
newDbc[count] = dbc2[index];
flags[index] = true;
}
}
// 先排序,再返回
arraySort(newDbc);
newDbc[6] = dbc2[r.nextInt(16)];// 添加蓝球 到末尾
return newDbc;</P>
<P> }</P>
<P> /**
* 数组 选择排序,从小到大。
*/
public static void arraySort(String[] arr) {
// 在处理的时候,把字符串元素转换成 int 然后才能比较
// 选择排序,从第一个开始,挨个的同后面的对比
for (int i = 0; i < arr.length - 2; i++) { // 因为自己不和自己比,还有就是只排序前5位,最后一位是篮球,不用排
for (int j = i + 1; j < arr.length - 1; j++) {
int num1 = Integer.parseInt(arr[i]); // 把该角标位置的字符串转成int类型
int num2 = Integer.parseInt(arr[j]);
if (num1 > num2) {
String temp = arr[i];// 同理,交换数组位置
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
}
</P>
复制代码
作者:
app297
时间:
2014-2-27 00:55
看错了。不是空指针异常。反正就是会出现一个异常。然后程序就崩溃了
作者:
yunzhongzhuhuo
时间:
2014-2-27 08:17
方法dCBallOpen()中,在第44-49行代码中,可能会出现相同的随机数,然后那个count索引的newDbc[count]不会被赋值,就会出现值为null的情况,所以就会出行NumberFormatException
解决:
for (int count = 0; count < 6; count++) {
int index = r.nextInt(33);
if (!flags[index]) {
newDbc[count] = dbc2[index];
flags[index] = true;
}
else{
count--;
continue;
}
}
复制代码
作者:
薛旻
时间:
2014-2-27 10:31
里面有几点小错误,最严重的如楼上所说,一旦标记出现重复的数值时,就把这个值舍弃,然后数组又往后走了,字符串数组就出现了默认值null,我改了下代码。
int count = 0;
while(count < 6) {
int index = r.nextInt(33);
if (!flags[index]) {
newDbc[count] = dbc2[index];
flags[index] = true;
count++;
}else {
continue;
}
}
复制代码
还有些小问题就是创建1-33数组时,你忘了加1,存入了两个9,没有33
// 生成null的双色球数字
for (int i = 9; i < dbc2.length; i++) {
dbc2[i] = i + 1 + "";
}
复制代码
还有就是随机数生成的问题,该好好思考一下,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