为什么使用整型变量会抛出异常?

2024-01-27

我遇到过以下两个代码。为什么它不抛出浮点异常,而在其他情况下它将抛出运行时异常。

class FloatingPoint
    {
      public static void main(String [] args)
       {
         float a=1000f;
         float b=a/0;
        System.out.println("b=" +b);
       }
    }

输出:b=无穷大.

如果我尝试使用 int 值,那么它将引发运行时异常。 为什么会这样呢?


简短的回答

积分型 (金龙4.2.1 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.1)与浮点类型(金龙4.2.3 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3)。行为和操作可能有相似之处,但也存在特征上的区别,因此混淆两者可能会导致许多陷阱。

除以零时的行为差异只是这些差异之一。因此,简短的回答是 Java 会这样做,因为该语言是这样说的。


关于整数和浮点值

整数类型的值是以下范围内的整数:

  • byte: from -128 to 127, inclusive, i.e. [-27, 27-1]
  • short: from -32768 to 32767, inclusive, i.e. [-215, 215-1]
  • int: from -2147483648 to 2147483647, inclusive, i.e. [-231, 231-1]
  • long: from -9223372036854775808 to 9223372036854775807, inclusive, i.e. [-263, 263-1]
  • char, from '\u0000' to '\uffff' inclusive, that is, from 0 to 65535, i.e. [0, 216-1]

浮点类型是float and double,它们在概念上与单精度 32 位和双精度 64 位格式相关联IEEE 754 http://en.wikipedia.org/wiki/IEEE_754-1985价值观和运作。

它们的值按如下顺序从小到大排列:

  • 负无穷大,
  • 负有限非零值,
  • 正零和负零(即0.0 == -0.0),
  • 正有限非零值,以及
  • 正无穷大。

此外,还有特殊的非数字 (NaN)值,它们是无序的。这意味着如果其中一个(或两个!)操作数是NaN:

  • 数值比较运算符<, <=, >, and >= return false
  • 数值相等运算符==回报false
  • 数值不等式运​​算符!=回报true

尤其,x != x is true当且仅当x is NaN.

例如double、无穷大和NaN可以称为:

  • Double.POSITIVE_INFINITY http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#POSITIVE_INFINITY
  • Double.NEGATIVE_INFINITY http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#NEGATIVE_INFINITY
  • Double.NaN http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#NaN,可使用辅助方法进行测试boolean isNaN(double) http://download.oracle.com/javase/6/docs/api/java/lang/Double.html#isNaN%28double%29

情况类似于float and Float http://java.sun.com/javase/6/docs/api/java/lang/Float.html.


关于何时可能抛出异常

数值运算可能只会抛出一个Exception在这些情况下:

  1. NullPointerException,如果拆箱转换 anull需要参考
  2. ArithmeticException,如果右侧为零integer除法/余数运算
  3. OutOfMemoryError、如果需要装箱转换且内存不足

它们按重要性排序,考虑到它们是陷阱的常见来源。一般来说:

  • 对于框类型要特别小心,就像所有其他引用类型一样,它们可能是null
  • 特别注意整数除法/求余运算的右侧
  • 算术上溢/下溢DOES NOT导致抛出异常
  • 精度损失DOES NOT导致抛出异常
  • 数学上的不定浮点运算DOES NOT导致抛出异常

除以零

For integer手术:

  • 除法和余数运算抛出ArithmeticException如果右侧为零

For 浮点手术:

  • 如果左操作数是NaN or 0,结果是NaN.
  • 如果操作是division,它溢出并且结果是有符号无穷大
  • 如果操作是,结果是NaN

所有浮点运算的一般规则如下:

  • 溢出的运算会产生带符号的无穷大。
  • 下溢运算会产生非规范化值或有符号零。
  • 没有数学确定结果的运算会产生NaN.
  • 所有数字运算NaN作为操作数产生NaN因此。

Appendix

这个已经很长的答案仍然没有涵盖许多问题,但鼓励读者浏览相关问题和参考资料。

相关问题

  • 这三个特殊浮点值是什么意思:正无穷大、负无穷大、NaN? https://stackoverflow.com/questions/1007586/what-do-these-three-special-floating-point-values-mean-positive-infinity-negati
  • Java中NaN是什么意思。 https://stackoverflow.com/questions/2618059/in-java-what-does-nan-mean
  • Java什么时候可以产生NaN(有具体代码问题) https://stackoverflow.com/questions/2887131/when-can-java-produce-a-nan-with-specific-code-question
  • 为什么在 Java 中 (360 / 24) / 60 = 0 … https://stackoverflow.com/questions/2475652/why-does-360-24-60-0-in-java/(区分整数和浮点运算!)
  • 为什么 Java 中 null == 0 会抛出 NullPointerException? https://stackoverflow.com/questions/3352791/why-null-0-throws-nullpointerexception-in-java/(小心盒装原语的危险!)
  • 1/0 是合法的 Java 表达式吗? https://stackoverflow.com/questions/2934063/is-1-0-a-legal-java-expression(绝对地!!!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用整型变量会抛出异常? 的相关文章

随机推荐

  • MDX - TopCount 加“其他”或“其余”

    我创建了一个 MDX 查询 用于计算前 10 个邮政编码 根据我的患者住院测量 如下所示 WITH MEMBER Discharge Date Y M D Aggregation AS AGGREGATE EXISTING Current
  • 如何在 Github Actions 中查看已取消步骤的日志?

    我的工作流程中有一个步骤是运行命令 python 脚本 这个 python 脚本似乎挂在执行过程中的某个地方 GitHub 显示该步骤在运行时被卡住并且没有任何反应 为了调试这个 我想查看 python 脚本的日志输出 我怎样才能做到这一点
  • PHP 中的测试驱动开发

    我是一名使用 PHP 工作的 Web 开发人员 我在 C 桌面应用程序中使用测试驱动开发的经验有限 在这种情况下 我们使用 nUnit 作为单元测试框架 我想在新项目中开始使用 TDD 但我真的不知道从哪里开始 对于基于 PHP 的单元测试
  • 通知在 flutter 上显示两次

    我被困住了 我的后台通知显示两次 但前台只有一个通知 这是我的代码 Future
  • 谷歌数据存储中的节点分页

    我在使用 Google Datastore 进行分页时遇到问题 我有一个查询 没有限制 有几百个结果 我想检索 5 个 将它们发送回用户 如果用户想要更多 他们会检索下 5 个 根据文档 我创建了查询 var query datastore
  • div 相对于窗口的位置?

    尝试找到 div 相对于窗口的位置 我有一个水平 div 我想获取相对于窗口的左侧值 因此 如果我将第二个 div 滚动到窗口左侧 它将显示 0 不确定如果没有父 div 这是否可行 这是我的小提琴 http jsfiddle net FS
  • 如何在 Symfony2 配置中添加带有值的数组?

    我想在配置文件 config yml 中添加一个简单的值列表 例如 my bundle columns col1 col2 将节点添加到配置解析器时 它只是失败 rootNode treeBuilder gt root my bundle
  • NHibernate 测试,模拟 ISession

    我正在使用 NHibernate 和 Rhinomocks 但在测试我想要的东西时遇到了困难 我想在不访问数据库的情况下测试以下存储库方法 其中 session 作为 ISession 注入存储库 public class Reposito
  • SQL语句只删除一行重复项

    所以我正在使用 Ruby 工作 并假设我的两列表中有 6 行完全相同 就我而言 我的表 campaign items 有两列 campaign name 和 item 我想使用单个查询仅删除 6 个重复项中的一行 我是这样开始的 db ex
  • Flex 页脚在 Chrome 中不会停留在底部

    仅当内容短于视口时 我才使用 Flexbox 让页脚保持在底部 如果它较高 页脚应保持在内容下方 以便您必须滚动才能看到它 这在 Firefox 和 Edge 中可以正常工作 但在 Chrome 或 IE 中则不行 在 Chrome 中 正
  • WCF - 自定义凭据和安全令牌

    我对 WCF 开发相当陌生 在学习该框架时遇到了一些问题 我有一个必须支持 REST 和 SOAP 的服务 API 到目前为止 这很容易实现 尤其是使用 WCF4 和路由 我目前正在研究授权 并通过创建两个新的管理器类来扩展 Authori
  • 如何在Apache中设置mod_lua来访问第三方Lua模块?

    我正在尝试为 Apache 设置 mod lua 模块 但在访问第三方 Lua 模块时遇到了困难 假设我在 Apache 的 htdocs 文件夹中有一个 hello world lua 其中包含以下内容 require apache2 f
  • 尽管已传输,但仍出现错误“无法传输文件 *.jar,状态代码为 409”

    我正在尝试将项目发布到azure artefacts 项目pom是这样的
  • Django 使用 selenium 进行测试,未加载固定装置

    我正在使用 Selenium 为 Django 网站设置功能测试 我有一个固定文件 users fixtures users json 并在另一个应用程序的功能测试中使用它 accounts 运行测试时 我还运行我的开发服务器来接受来自 S
  • 为什么 std::visit 必须有单一返回类型?

    玩耍的同时std variant and std visit出现了以下问题 考虑以下代码 using Variant std variant
  • m2eclipse过滤测试资源

    我正在使用 m2eclipse 我想右键单击并从 eclipse 内部运行测试 同时从 Maven 过滤测试资源 我怎样才能做到这一点 从 Eclipse 中 当我右键单击测试时 我没有得到任何 m2eclipse 选项 Julia 如同
  • LinqPad 在每个表的末尾添加一个 S

    我刚刚下载了 LinqPad 以探索在我正在开发的应用程序中使用 Linq 查询的好处 但是当我查看左侧列中的数据库表时 LinqPad 显示我的所有表 末尾带有 s 例如实例 CategoryTbl 变为 CategoryTbls 但是当
  • S3 PUT 不适用于 JavaScript 中的预签名 URL

    我已经在 java 中为 HTTP PUT 方法生成了一个预签名的 S3 URL URL 的稍微修改版本 https s3 amazonaws com somebucket pre signed url key 2 AWSAccessKey
  • 为什么堆栈的深度使用会导致简单解释器的超线性时间行为?

    type Expr Lit of int Add of Expr Expr let rec intr function Lit as x gt x Add Lit a Lit b gt Lit lt a b Add a b gt intr
  • 为什么使用整型变量会抛出异常?

    我遇到过以下两个代码 为什么它不抛出浮点异常 而在其他情况下它将抛出运行时异常 class FloatingPoint public static void main String args float a 1000f float b a