Java 中的陷阱題,你知道幾個?

1、找奇數(shù):

public static boolean isOdd(int i){

return i % 2 == 1;

}

上面的方法真的能找到所有的奇數(shù)么?

A:沒有考慮到負數(shù)問題,如果i為負則不正確。應該return i%2 == 0

2. 浮點數(shù)相減

System.out.println(2.0-1.9);

A:Java中的簡單浮點數(shù)類型float和double不能夠進行運算。不光是Java,在其它很多編程語言中也有這樣的問題。在大多數(shù)情況下,計算的結果是準確的,但是多試幾次(可以做一個循環(huán))就可以試出類似上面的錯誤。當然加減乘除都有可能有問題,比如:

System.out.println(0.05+0.01);

System.out.println(1.0-0.42);

System.out.println(4.015*100);

System.out.println(123.3/100);

這是因為有些十進制有限位數(shù)的小數(shù),到二進制里面可能會變成無限循環(huán)小數(shù),在浮點數(shù)中不能表示而損傷精度。

解決方法:

2.1. 如果是判斷a-b是否等于c,或者a+b是否等于c的,可以使用

if(0.05+0.01-0.06 < 0.0000001)

{

}

2.2. 在《Effective Java》這本書中提到一個原則,float和double只能用來做科學計算或者是工程計算,在商業(yè)計算中我們要用 java.math.BigDecimal來解決

System.out.println((new BigDecimal("2.0")).subtract(new BigDecimal("1.9")).doubleValue());

3. 無限循環(huán)

public static final int END = Integer.MAX_VALUE;

public static final int START = END - 2;

public static void main(String[] args) {

int count = 0;

for (int i = START; i <= END; i++)

count++;

System.out.println(count);

}

A:這里無限循環(huán)的原因就是當i為Integer.MAX_VALUE時,此時for循環(huán)是先++,然后判斷i是否<=END,當i為Integer.MAX_VALUE再++時,i變成了負數(shù)。所以就一直循環(huán)下去。

變成負數(shù)的原因就是int溢出了。這里將<=END改成<END就可以解決問題。

4. 到底返回什么?

public static boolean decision() {

try {

return true;

} finally {

return false;

}

}

A:返回false。此時return true是不可達語句,在編譯階段將優(yōu)化去掉。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一...
    阿里高級軟件架構師閱讀 3,388評論 0 19
  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔...
    開心的鑼鼓閱讀 3,394評論 0 9
  • Java經典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 2,076評論 0 2
  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔...
    葉總韓閱讀 5,226評論 0 41
  • 彼岸花 唯一開在黃泉路上的花 花開一千年 花落一千年 花妖與葉生 生生世世 永生不想見 只有花妖死去的那一刻,葉神...
    師一_閱讀 276評論 2 0

友情鏈接更多精彩內容