摘要:概念補(bǔ)充在中進(jìn)行數(shù)字類型運算的時,之前一直有一種錯誤的觀念,即進(jìn)行除法運算時當(dāng)除數(shù)為時在運行時會拋出運行時異常。負(fù)無窮,負(fù)數(shù)除以零得到負(fù)無窮。非數(shù)字,除以時得到非數(shù)字。撥云見日探究清楚之后,一切都是那樣的理所應(yīng)當(dāng)。
背景
在對Double類型的數(shù)據(jù)進(jìn)行計算操作,將結(jié)果轉(zhuǎn)化為BigDecimal時拋出了下面的異常,進(jìn)行了Debug才發(fā)現(xiàn)了問題原因,同時也暴露出了自己在一些基礎(chǔ)知識上還有些欠缺。
Exception in thread "main" java.lang.NumberFormatException: Infinite or NaN at java.math.BigDecimal.概念補(bǔ)充(BigDecimal.java:895) at java.math.BigDecimal. (BigDecimal.java:872) at com.lingyejun.authenticator.DoubleTest.main(DoubleTest.java:13)
在java中進(jìn)行數(shù)字類型運算的時,之前一直有一種錯誤的觀念,即進(jìn)行除法運算時當(dāng)除數(shù)為0時在運行時會拋出java.lang.ArithmeticException: / by zero運行時異常。如此想當(dāng)然的以為對于浮點類型如Float和Double也是如此,下面一段代碼便可以說明問題。
package com.lingyejun.authenticator; public class DoubleTest { public static void main(String[] args) { Double d1 = 10 / 0D; Double d2 = -10 / 0D; Double d3 = 0.0 / 0D; System.out.println("d1=" + d1 + " d2=" + d2 + " d3=" + d3); } }
運算結(jié)果為“d1=Infinity d2=-Infinity d3=NaN”,什么?數(shù)字運算居然還能算出來了字符串???打印出來的Infinity、-Infinit、NaN其實不是字符串,而是double類型的常量,查看源碼注釋便懂了。
/** * A constant holding the positive infinity of type * {@code double}. It is equal to the value returned by * {@code Double.longBitsToDouble(0x7ff0000000000000L)}. */ public static final double POSITIVE_INFINITY = 1.0 / 0.0; /** * A constant holding the negative infinity of type * {@code double}. It is equal to the value returned by * {@code Double.longBitsToDouble(0xfff0000000000000L)}. */ public static final double NEGATIVE_INFINITY = -1.0 / 0.0; /** * A constant holding a Not-a-Number (NaN) value of type * {@code double}. It is equivalent to the value returned by * {@code Double.longBitsToDouble(0x7ff8000000000000L)}. */ public static final double NaN = 0.0d / 0.0;
正無窮:POSITIVE_INFINITY,正數(shù)除以零得到正無窮。
負(fù)無窮:NEGATIVE_INFINITY,負(fù)數(shù)除以零得到負(fù)無窮。
非數(shù)字:NaN,0除以0時得到非數(shù)字。
異常原因通過查看BigDecimal類中針對Double類型數(shù)據(jù)的構(gòu)造方法,我們知道了,在構(gòu)造BigDecimal對象時,構(gòu)造方法中傳入的Double類型為無窮大或非數(shù)字時會拋出NumberFormatException異常。
public BigDecimal(double val, MathContext mc) { if (Double.isInfinite(val) || Double.isNaN(val)) throw new NumberFormatException("Infinite or NaN");
撥云見日探究清楚之后,一切都是那樣的理所應(yīng)當(dāng)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/77907.html
摘要:概念補(bǔ)充在中進(jìn)行數(shù)字類型運算的時,之前一直有一種錯誤的觀念,即進(jìn)行除法運算時當(dāng)除數(shù)為時在運行時會拋出運行時異常。負(fù)無窮,負(fù)數(shù)除以零得到負(fù)無窮。非數(shù)字,除以時得到非數(shù)字。撥云見日探究清楚之后,一切都是那樣的理所應(yīng)當(dāng)。 背景 在對Double類型的數(shù)據(jù)進(jìn)行計算操作,將結(jié)果轉(zhuǎn)化為BigDecimal時拋出了下面的異常,進(jìn)行了Debug才發(fā)現(xiàn)了問題原因,同時也暴露出了自己在一些基礎(chǔ)知識上還有些...
摘要:異常處理的個最佳實踐原文地址翻譯出處在中,異常處理是個很麻煩的事情。使用描述性消息拋出異常這個最佳實踐背后的想法與前兩個類似。當(dāng)你以錯誤的格式提供時,它將被類的構(gòu)造函數(shù)拋出。類提供了特殊的構(gòu)造函數(shù)方法,它接受一個作為參數(shù)。 Java 異常處理的 9 個最佳實踐 原文地址:https://dzone.com/articles/9-...翻譯出處:https://www.oschina.n...
摘要:出現(xiàn)錯誤引發(fā)崩潰日志的流程分析這個錯誤是應(yīng)用的方法總數(shù)限制造成的。 目錄介紹 1.1 java.lang.ClassNotFoundException類找不到異常 1.2 java.util.concurrent.TimeoutException連接超時崩潰 1.3 java.lang.NumberFormatException格式轉(zhuǎn)化錯誤 1.4 java.lang.Illegal...
摘要:此類問題,在配置中,做的比較好,所以,官方也不是很放心其注解,建議使用。錯誤的引起,是和引起的,原因給的是字符串,卻拿一個數(shù)字比較,會做一些轉(zhuǎn)化,結(jié)果在數(shù)字格式化時發(fā)生異常。 使用mybatis注解開發(fā)的時候,總會遇到很多問題,但是mybatis的注解并不是那么的美好,一些問題或者錯誤根本不能給出準(zhǔn)確的定位,有時候,甚至?xí)o出Unknow Source的錯誤,獲取就是一個關(guān)閉標(biāo)簽沒有關(guān)...
摘要:換句話說,環(huán)境或應(yīng)用程序沒有處于請求操作的適當(dāng)狀態(tài)。項目中異常分析引發(fā)崩潰日志的流程分析解決辦法常見的出現(xiàn)場景狀態(tài)異常非法線程操作。導(dǎo)致的方法出來顯示消息位于該消息之后,遲遲沒有執(zhí)行。這時候,的超時檢測結(jié)束,刪除了服務(wù)中的記錄。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫異常 1.2 java.lang.IllegalStateExce...
閱讀 1301·2023-04-26 02:20
閱讀 3415·2021-11-22 14:45
閱讀 4326·2021-11-17 09:33
閱讀 1080·2021-09-06 15:00
閱讀 1555·2021-09-03 10:30
閱讀 4024·2021-07-26 22:01
閱讀 1065·2019-08-30 15:54
閱讀 599·2019-08-30 15:43