Java代码执行顺序解析及实例输出异常的技术问询
Java代码执行顺序与输出异常排查
问题梳理
你遇到两个核心疑问:
- 预期调用
book.ship()先执行,但实际输出先出现High value item!,和预期顺序不符 - 认为
book实例的cost=9.99触发了High value item!输出,不符合逻辑
问题解释与排查步骤
1. 执行顺序不符的原因
代码的执行顺序要注意对象初始化的时机:
- 在
main方法中,每执行一次new Order(...),就会立刻调用该对象的构造方法,这个过程发生在调用ship()方法之前。 - 看
main里的代码执行流程:// 1. 初始化book实例:执行构造方法,cost=9.99不满足>24.00,无输出 Order book = new Order(true, 9.99, "Express"); // 2. 初始化chemistrySet实例:执行构造方法,cost=72.50>24.00,输出"High value item!" Order chemistrySet = new Order(false, 72.50, "Regular"); // 3. 调用book的ship()方法,输出"Shipping"和运费 book.ship(); // 4. 调用chemistrySet的ship()方法,输出"Order not ready" - 所以实际输出顺序和你预期的差异,是因为对象构造的代码在
ship()调用前就执行了。
2. High value item!的来源误解
- 这句话不是
book实例输出的,而是chemistrySet实例的构造方法输出的:chemistrySet的cost=72.50,满足cost>24.00的判断条件;而book的cost=9.99不满足,构造方法不会触发该输出。 - 快速排查这类问题的方法:给输出增加上下文标识,比如修改构造方法里的打印语句:
这样能直接看到触发输出的具体数值,避免混淆实例。if (cost > 24.00) { System.out.println("High value item! (当前实例cost: " + cost + ")"); }
3. 通用排查技巧
- 加日志标识:给
Order类新增一个itemName属性,构造时传入,在所有打印语句中带上该名称,比如System.out.println(itemName + ": Shipping");,明确每一行输出属于哪个实例。 - 断点调试:在IDE中给构造方法和
ship()方法加断点,逐行执行观察代码流,能清晰看到每一步执行的是哪个对象的哪个方法。
内容的提问来源于stack exchange,提问作者Aris Nguyen
相关产品推荐
相关产品推荐

