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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 缠中说禅 于 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循环底层是使用的迭代器,在迭代器中不能进行增加或者删除操作。
问题解决方法:
更换思路,不使用将不符合条件元素删除的方法,而是建立一个新的集合,将符合条件的元素全部加入到新集合当中。最后遍历新集合,得出最终满足条件的元素。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马