Java 条件语句 - if...else

张开发
2026/4/6 23:29:39 15 分钟阅读

分享文章

Java 条件语句 - if...else
Java 条件语句 - if…else 学习笔记详细版一、概述条件语句Conditional Statements是程序流程控制的基础用于根据不同的条件执行不同的代码块。在 Java 中if...else是最核心的条件控制结构它允许程序在运行时做出“决策”。核心逻辑如果条件为true执行代码块 A。如果条件为false执行代码块 B如果有else。二、if语句单分支1. 语法结构if(布尔表达式){// 当条件为 true 时执行的代码}2. 执行流程计算括号内的布尔表达式。如果结果为true执行大括号内的代码。如果结果为false跳过大括号内的代码直接执行后续语句。3. 代码示例intage18;if(age18){System.out.println(您已成年可以进入网吧。);}System.out.println(程序继续执行...);输出您已成年可以进入网吧。 程序继续执行...注意如果if后面只有一条语句大括号{}可以省略但强烈建议始终加上大括号以避免逻辑错误和提高可读性。// 不推荐容易出错if(age18)System.out.println(成年);三、if...else语句双分支1. 语法结构if(布尔表达式){// 条件为 true 时执行}else{// 条件为 false 时执行}2. 执行流程条件为true→ 执行if块。条件为false→ 执行else块。二选一必选其一。3. 代码示例intscore65;if(score60){System.out.println(恭喜考试及格);}else{System.out.println(很遗憾考试不及格请继续努力。);}四、if...else if...else语句多分支1. 语法结构用于处理多种情况按顺序判断一旦满足某个条件就执行对应的代码块并跳过后续所有判断。if(条件1){// 条件 1 为 true 时执行}elseif(条件2){// 条件 1 为 false 且 条件 2 为 true 时执行}elseif(条件3){// ...}else{// 所有条件都为 false 时执行}2. 执行流程从上到下依次判断条件。遇到第一个为true的条件执行对应代码块立即跳出整个 if 结构。如果所有条件都为false执行最后的else块如果有。3. 代码示例成绩等级判断intscore85;Stringgrade;if(score90){gradeA;System.out.println(优秀);}elseif(score80){gradeB;System.out.println(良好);}elseif(score70){gradeC;System.out.println(中等);}elseif(score60){gradeD;System.out.println(及格);}else{gradeE;System.out.println(不及格);}System.out.println(最终等级grade);输出良好 最终等级B关键点条件判断是互斥的。如果score是 95它满足90执行后直接结束不会再去判断80。顺序很重要如果先判断60那么所有及格的人都会进入第一个分支后面的判断永远不会执行。五、嵌套if语句 (Nested If)1. 概念在一个if或else块内部再包含一个完整的if...else结构。2. 语法结构if(外层条件){if(内层条件){// 两个条件都为 true 时执行}else{// 外层 true内层 false}}else{// 外层 false}3. 代码示例登录验证Stringusernameadmin;Stringpassword123456;booleanhasPermissiontrue;if(username.equals(admin)){if(password.equals(123456)){if(hasPermission){System.out.println(登录成功进入管理员后台。);}else{System.out.println(账号密码正确但无权限访问。);}}else{System.out.println(密码错误。);}}else{System.out.println(用户名不存在。);}4. 优化建议嵌套层数过多会导致代码难以阅读“箭头型代码”。优化方案 1使用逻辑运算符合并条件。// 优化后if(username.equals(admin)password.equals(123456)hasPermission){System.out.println(登录成功进入管理员后台。);}elseif(username.equals(admin)password.equals(123456)){System.out.println(账号密码正确但无权限访问。);}elseif(username.equals(admin)){System.out.println(密码错误。);}else{System.out.println(用户名不存在。);}优化方案 2提前返回Early Return减少嵌套。if(!username.equals(admin)){System.out.println(用户名不存在。);return;// 直接结束方法}if(!password.equals(123456)){System.out.println(密码错误。);return;}if(!hasPermission){System.out.println(无权限访问。);return;}System.out.println(登录成功);六、switch语句条件语句的替代方案虽然if...else功能强大但在处理多个离散值如枚举、整数、字符串时switch语句更简洁、可读性更高。1. 语法结构switch(表达式){case值1:// 代码块break;case值2:// 代码块break;default:// 默认代码块break;}2. 支持的数据类型byte,short,char,intenum(枚举)String(Java 7)Character,Byte,Short,Integer(包装类)3. 代码示例星期判断intday3;StringdayName;switch(day){case1:dayName星期一;break;case2:dayName星期二;break;case3:dayName星期三;break;case4:dayName星期四;break;case5:dayName星期五;break;case6:case7:// 多个 case 共用一段代码dayName周末;break;default:dayName无效日期;break;}System.out.println(今天是dayName);4.switchvsif...else特性if...elseswitch适用场景范围判断、复杂逻辑离散值匹配、枚举、字符串性能较低需逐个判断较高底层可能用跳转表可读性多分支时较乱多分支时清晰支持类型所有布尔表达式有限类型int, String, enum 等注意switch中如果忘记写break会发生穿透Fall-through继续执行下一个case的代码。这有时是有意为之如上面的case 6: case 7:但通常是 Bug 的来源。七、三元运算符 (Ternary Operator)三元运算符是if...else的简写形式适用于简单的赋值或返回操作。1. 语法变量条件?表达式1:表达式2;条件为true→ 取表达式1的值。条件为false→ 取表达式2的值。2. 代码示例intage20;Stringstatus(age18)?成年:未成年;System.out.println(status);// 输出成年3. 使用限制只能用于表达式有返回值不能用于执行多条语句。两个分支的类型必须兼容。嵌套三元运算符会降低可读性尽量避免。// ❌ 不推荐Stringresultscore90?A:score80?B:score70?C:D;// ✅ 推荐使用 if...elseif(score90)resultA;elseif(score80)resultB;// ...八、常见错误与最佳实践1. 误用代替intx10;// if (x 10) { ... } // ❌ 编译错误赋值表达式不是布尔类型// if (x 10) { ... } // ✅ 正确注意在 C/C 中if (x 10)是合法的赋值后返回 10非零即真但在 Java 中严禁这样做编译器会直接报错。2. 忘记大括号intx10;if(x5)System.out.println(大于 5);System.out.println(这行代码永远会执行);// ❌ 逻辑错误不属于 if 块建议始终使用大括号{}即使只有一行代码。3. 浮点数比较doublea0.1*3;doubleb0.3;// if (a b) { ... } // ❌ 可能为 false (精度问题)if(Math.abs(a-b)1e-6){...}// ✅ 推荐4. 逻辑短路Stringstrnull;// if (str ! null str.length() 0) { ... } // ✅ 安全// if (str.length() 0 str ! null) { ... } // ❌ 报错str 为 null 时先执行了 length()5. 代码风格KR 风格推荐大括号在同一行。if(condition){// code}Allman 风格大括号独占一行。if(condition){// code}阿里巴巴规范强制使用大括号即使只有一行。九、实战练习1. 判断闰年规则能被 4 整除但不能被 100 整除或者能被 400 整除。intyear2024;booleanisLeap;if((year%40year%100!0)||(year%4000)){isLeaptrue;}else{isLeapfalse;}System.out.println(year(isLeap? 是闰年: 不是闰年));2. 简易计算器importjava.util.Scanner;ScannerscannernewScanner(System.in);System.out.print(请输入第一个数字);doublenum1scanner.nextDouble();System.out.print(请输入运算符 (, -, *, /));Stringopscanner.next();System.out.print(请输入第二个数字);doublenum2scanner.nextDouble();doubleresult0;booleanvalidtrue;if(op.equals()){resultnum1num2;}elseif(op.equals(-)){resultnum1-num2;}elseif(op.equals(*)){resultnum1*num2;}elseif(op.equals(/)){if(num2!0){resultnum1/num2;}else{System.out.println(错误除数不能为 0);validfalse;}}else{System.out.println(错误无效的运算符);validfalse;}if(valid){System.out.println(结果result);}十、总结结构适用场景关键点if单一条件判断条件为真执行否则跳过if...else二选一非真即假互斥if...else if...else多选一顺序判断一旦匹配立即跳出嵌套if复杂条件组合避免过深嵌套善用或提前返回switch离散值匹配记得break支持 String/enum三元运算符简单赋值条件 ? 真值 : 假值核心原则可读性第一代码是写给人看的不是写给机器看的。避免魔法值使用常量代替硬编码的数字或字符串。防御性编程处理边界情况如除零、空指针。保持简洁能用三元运算符就不用if...else能用switch就不用长链if...else if。掌握if...else及其变体是编写逻辑严密、功能正确的 Java 程序的基石

更多文章