本帖最后由 缠中说禅 于 2019-1-8 17:00 编辑
【石家庄总结】就业班第一阶段day01day02bug总结
异常一
创建人 刘瑞佳
问题标题 运行结果异常
问题分类 数据类型转换问题
附件
[Java] 纯文本查看 复制代码 public class Test16 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sb = new SimpleDateFormat("yyyy年MM月dd日");
Date now = sb.parse("2018年02月01日");
long l = now.getTime();
// 这里在进行运算时出现了错误
long lo = 100*24*60*60*1000L + l;
Date d = new Date(lo);
String str = sb.format(d);
System.out.println("100天后的时间为:" + str);
}
}
问题分析:
这道题的需求是在于求出一百天之后的时间,实际解决方式应是用Calendar类中方法来解决,在这里我用了毫秒值的方法进行解决。因为毫秒值的类型是很大的,超出了int范围。而我在求100天的毫秒值时,用了100*24*60*60*1000,这里数字的默认类型为int类型,结果也是int类型,可以看出结果是超出了int范围。所以这里的结果默认为int范围上限 2^38,所以会最终出现运行结果异常。
问题解决方法:
修改数据值100*24*60*60*1000为100*24*60*60*1000L,加上L之后1000这个数字成为了long类型,根据自动转换的规则,在运行时,所有参加运算的数字会自动提升成为范围较大的类型。所以会运行结果正确。
异常二
创建人 刘瑞佳
问题标题 代码运行结果错误
问题分类 运行结果数据错误
附件
[Java] 纯文本查看 复制代码 public class Test06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Double> list = new ArrayList<>();
for (int i = 0; i < 8; i++) {
System.out.println("请录入第" + (i + 1) + "个评委成绩:");
double score = sc.nextDouble();
list.add(score);
}
double max = list.get(0);
double min = list.get(0);
double sum = 0;
for (Double aDouble : list) {
sum += aDouble;
if (max < aDouble) {
max = aDouble;
}
if (min > aDouble) {
min = aDouble;
}
}
// 问题出现在这里,在最终输出语句中,由于表达式中的数字均为int数字,所以导致最后平均分出现整数。
System.out.println("选手的最终得分为:" + ((sum - max - min) / (list.size() - 2)));
}
}
问题分析:
在这个代码中我出现的问题是,最后需求是要求出平均分数,而我最开始在写代码的过程之中,分数均使用了int类型数字,导致最后在输出语句中直接将结果的表达式写上之后,运行出来的结果为整数,并不是小数。
问题解决方法:
将代码中涉及分数的变量类型修改为double类型,最后结果运算出来也是double类型。
异常三
创建人 刘瑞佳
问题标题 运行异常
问题分类 增强for循还中使用了remove方法。
附件
[Java] 纯文本查看 复制代码 public class Test04 {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<String>();
coll.add("123");
coll.add("1234");
coll.add("12345");
coll.add("654123");
coll.add("456789123");
coll.add("1112222333444");
coll.add("555555");
Collection<String> coll1 = new ArrayList<>();
// 这里是最开始出现异常的地方。在增强for循环当中使用了remove方法。
for (String s : coll) {
if (s.length() >= 5 && s.length()<= 10) {
coll1.add(s);
}
}
for (String s : coll1) {
System.out.println(s);
}
}
}
问题分析:
这个代码的需求是将长度为[5,,10]的字符串筛选出来并打印输出。在这里,我最开始的思路,是使用增强for循环对集合进行遍历,并在for循环中,增加if语句,如果不符合需求,则将其删除。在第一次运行之后出现异常。分析得出原因是增强for循环底层是使用的迭代器,在迭代器中不能进行增加或者删除操作。
问题解决方法:
更换思路,不使用将不符合条件元素删除的方法,而是建立一个新的集合,将符合条件的元素全部加入到新集合当中。最后遍历新集合,得出最终满足条件的元素。
|