阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

if条件判断

309次阅读
没有评论

共计 4024 个字符,预计需要花费 11 分钟才能阅读完成。

在 Java 程序中,如果要根据条件来决定是否执行某一段代码,就需要 if 语句。

if语句的基本语法是:

if (条件) {// 条件满足时执行
}

根据 if 的计算结果(true还是 false),JVM 决定是否执行if 语句块(即花括号 {} 包含的所有语句)。

让我们来看一个例子:

// 条件判断
public class Main {public static void main(String[] args) {int n = 70;
        if (n >= 60) {System.out.println("及格了");
        }
        System.out.println("END");
    }
}

当条件 n >= 60 计算结果为 true 时,if语句块被执行,将打印 "及格了",否则,if 语句块将被跳过。修改 n 的值可以看到执行效果。

注意到 if 语句包含的块可以包含多条语句:

// 条件判断
public class Main {public static void main(String[] args) {int n = 70;
        if (n >= 60) {System.out.println("及格了");
            System.out.println("恭喜你");
        }
        System.out.println("END");
    }
}

if 语句块只有一行语句时,可以省略花括号{}:

// 条件判断
public class Main {public static void main(String[] args) {int n = 70;
        if (n >= 60)
            System.out.println("及格了");
        System.out.println("END");
    }
}

但是,省略花括号并不总是一个好主意。假设某个时候,突然想给 if 语句块增加一条语句时:

// 条件判断
public class Main {public static void main(String[] args) {int n = 50;
        if (n >= 60)
            System.out.println("及格了");
            System.out.println("恭喜你"); // 注意这条语句不是 if 语句块的一部分
        System.out.println("END");
    }
}

由于使用缩进格式,很容易把两行语句都看成 if 语句的执行块,但实际上只有第一行语句是 if 的执行块。在使用 git 这些版本控制系统自动合并时更容易出问题,所以不推荐忽略花括号的写法。

else

if语句还可以编写一个 else {...},当条件判断为false 时,将执行 else 的语句块:

// 条件判断
public class Main {public static void main(String[] args) {int n = 70;
        if (n >= 60) {System.out.println("及格了");
        } else {System.out.println("挂科了");
        }
        System.out.println("END");
    }
}

修改上述代码 n 的值,观察 if 条件为 truefalse时,程序执行的语句块。

注意,else不是必须的。

还可以用多个 if ... else if ... 串联。例如:

// 条件判断
public class Main {public static void main(String[] args) {int n = 70;
        if (n >= 90) {System.out.println("优秀");
        } else if (n >= 60) {System.out.println("及格了");
        } else {System.out.println("挂科了");
        }
        System.out.println("END");
    }
}

串联的效果其实相当于:

if (n >= 90) {// n >= 90 为 true:
    System.out.println("优秀");
} else {// n >= 90 为 false:
    if (n >= 60) {// n >= 60 为 true:
        System.out.println("及格了");
    } else {// n >= 60 为 false:
        System.out.println("挂科了");
    }
}

在串联使用多个 if 时,要 特别注意 判断顺序。观察下面的代码:

// 条件判断
public class Main {public static void main(String[] args) {int n = 100;
        if (n >= 60) {System.out.println("及格了");
        } else if (n >= 90) {System.out.println("优秀");
        } else {System.out.println("挂科了");
        }
    }
}

执行发现,n = 100时,满足条件 n >= 90,但输出的不是"优秀",而是"及格了",原因是if 语句从上到下执行时,先判断 n >= 60 成功后,后续 else 不再执行,因此,if (n >= 90)没有机会执行了。

正确的方式是按照判断范围从大到小依次判断:

// 从大到小依次判断:
if (n >= 90) {// ...
} else if (n >= 60) {// ...
} else {// ...
}

或者改写成从小到大依次判断:

// 从小到大依次判断:
if (n < 60) {// ...
} else if (n < 90) {// ...
} else {// ...
}

使用 if 时,还要特别注意边界条件。例如:

// 条件判断
public class Main {public static void main(String[] args) {int n = 90;
        if (n > 90) {System.out.println("优秀");
        } else if (n >= 60) {System.out.println("及格了");
        } else {System.out.println("挂科了");
        }
    }
}

假设我们期望 90 分或更高为“优秀”,上述代码输出的却是“及格”,原因是 >>=效果是不同的。

前面讲过了浮点数在计算机中常常无法精确表示,并且计算可能出现误差,因此,判断浮点数相等用 == 判断不靠谱:

// 条件判断
public class Main {public static void main(String[] args) {double x = 1 - 9.0 / 10;
        if (x == 0.1) {System.out.println("x is 0.1");
        } else {System.out.println("x is NOT 0.1");
        }
    }
}

正确的方法是利用差值小于某个临界值来判断:

// 条件判断
public class Main {public static void main(String[] args) {double x = 1 - 9.0 / 10;
        if (Math.abs(x - 0.1) < 0.00001) {System.out.println("x is 0.1");
        } else {System.out.println("x is NOT 0.1");
        }
    }
}

判断引用类型相等

在 Java 中,判断值类型的变量是否相等,可以使用 == 运算符。但是,判断引用类型的变量是否相等,==表示“引用是否相等”,或者说,是否指向同一个对象。例如,下面的两个 String 类型,它们的内容是相同的,但是,分别指向不同的对象,用 == 判断,结果为false

// 条件判断
public class Main {public static void main(String[] args) {String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1 == s2) {System.out.println("s1 == s2");
        } else {System.out.println("s1 != s2");
        }
    }
}

要判断引用类型的变量内容是否相等,必须使用 equals() 方法:

// 条件判断
public class Main {public static void main(String[] args) {String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1.equals(s2)) {System.out.println("s1 equals s2");
        } else {System.out.println("s1 not equals s2");
        }
    }
}

注意:执行语句 s1.equals(s2) 时,如果变量 s1null,会报NullPointerException

// 条件判断
public class Main {public static void main(String[] args) {String s1 = null;
        if (s1.equals("hello")) {System.out.println("hello");
        }
    }
}

要避免 NullPointerException 错误,可以利用短路运算符&&

// 条件判断
public class Main {public static void main(String[] args) {String s1 = null;
        if (s1 != null && s1.equals("hello")) {System.out.println("hello");
        }
    }
}

还可以把一定不是 null 的对象 "hello" 放到前面:例如:if ("hello".equals(s)) {...}

练习

请用 if ... else 编写一个程序,用于计算体质指数 BMI,并打印结果。

BMI = 体重 (kg) / 身高(m) 的平方

BMI 结果:

  • 过轻:低于 18.5
  • 正常:18.5 ~ 25
  • 过重:25 ~ 28
  • 肥胖:28 ~ 32
  • 非常肥胖:高于 32

下载练习

小结

if ... else可以做条件判断,else是可选的;

不推荐省略花括号{}

多个 if ... else 串联要特别注意判断顺序;

要注意 if 的边界条件;

要注意浮点数判断相等不能直接用 == 运算符;

引用类型判断内容相等要使用equals(),注意避免NullPointerException

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计4024字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7982469
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
免费领取huggingface的2核16G云服务器,超简单教程

免费领取huggingface的2核16G云服务器,超简单教程

免费领取 huggingface 的 2 核 16G 云服务器,超简单教程 前言 HuggingFace.co...
12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...