Kotlin代码中Course类grade字段返回null?如何修复?
问题:无效分数未正确设置为6.0的修复方案
运行以下Kotlin代码后,控制台输出Physics和Chemistry的grade字段为null。期望设置无效分数(如0.7、6.3)时,grade字段被设为6.0,但当前的setter逻辑未实现该效果,需要修复。
控制台输出
Math: 5.0 false English: 3.0 true Physics: null false Chemistry: null false
原代码
class Course( val name: String ){ var grade: Double? = null set(value){ try { if (value != null && value >= 1.0 && value <= 6.0){ field = value } } catch ( e: NullPointerException ){ field = 6.0 } } var passed: Boolean? = null get(){ return (this.grade ?:6.0) <= 4.0 } } fun main(){ val math = Course (" MATH ") math.grade = 5.0 //valid val english = Course (" ENGLISH ") english.grade = 3.0 // valid val physics = Course (" PHYSICS ") physics.grade = 0.7 // invalid val chemistry = Course (" CHEMISTRY ") chemistry.grade = 6.3 // invalid println("Math: " + math.grade ) println( math.passed ) println() println("English: " + english.grade ) println( english.passed ) println() println("Physics: " + physics.grade ) println( physics.passed ) println() println("Chemistry: " + chemistry.grade ) println( chemistry.passed ) println() }
问题分析与修复方案
原setter的问题
- 仅当
value处于有效范围(1.0~6.0)时才给field赋值,无效情况(如0.7、6.3)未处理,field保持初始的null - 捕获
NullPointerException毫无意义,代码中已经判断value != null,不会触发该异常
修复后的setter逻辑
- 若
value不为null且在1.0~6.0范围内,直接赋值给field - 其他所有情况(
value为null或超出范围),将field设为6.0
修复后的完整代码
class Course( val name: String ){ var grade: Double? = null set(value){ field = if (value != null && value >= 1.0 && value <= 6.0) { value } else { 6.0 } } var passed: Boolean? = null get(){ return (this.grade ?:6.0) <= 4.0 } } fun main(){ val math = Course (" MATH ") math.grade = 5.0 //valid val english = Course (" ENGLISH ") english.grade = 3.0 // valid val physics = Course (" PHYSICS ") physics.grade = 0.7 // invalid val chemistry = Course (" CHEMISTRY ") chemistry.grade = 6.3 // invalid println("Math: " + math.grade ) println( math.passed ) println() println("English: " + english.grade ) println( english.passed ) println() println("Physics: " + physics.grade ) println( physics.passed ) println() println("Chemistry: " + chemistry.grade ) println( chemistry.passed ) println() }
修复后输出效果
运行代码后,Physics和Chemistry的grade会被设置为6.0,passed为false,符合预期:
Math: 5.0 false English: 3.0 true Physics: 6.0 false Chemistry: 6.0 false
内容的提问来源于stack exchange,提问作者Emirhan Hans
相关产品推荐
相关产品推荐

