java编写代码时易出错_JAVA中易出错的小问题(一)
-----------?android培訓、java培訓、java學習型技術博客、期待與您交流!?------------
第一:奇數性
static boolean isodd(int i){
return i % 2 == 1;
}
}
奇數可定義為被2整除,余數為1的整數。表達式i%2計算的是i除以2時所產生的余數,因此看起啦這個這個程序改可行,但是它并不行,在四分之一的時間里它產生的都是錯誤的。因為在所有的int數值中,有一半是負數,而isodd方法對所有負數的判斷都會失敗。在任何負數上調用該方法都會返回false,無論該整數是偶數還是奇數。
第二:浮點數
public class Xiao {
public static void main(String[] args) {
System.out.print(2.00-1.10);
}
}
該程序打印的是0.89999999999999 而不是0.9;問題在于1.1這個數字不能被精確表示為一個double,因此被表示為最接近它的double值,該程序從2中減去的就是這個值。所以,這個計算結果并不是最接近0.9的double值。作為結果的double值的最短表示就是你所看到的值。
第三:長整數
public class longDivision {
public static void main(String[] args) {
final long A=24*60*60*1000*1000;
final long B=24*60*60*60*1000;
System.out.print(A/B);
}
}
看似程序該打印的是1000,其實打印的是5. 問題在于常數的計算確實溢出啦,雖然計算的結果合適放入long中,并且其空間還有富余,但是這個結果并不適合放入int中。這個計算完全是以int運算執(zhí)行的,并且只有在運算完成之后,其結果才提升為long。而此時已經太遲,返回溢出啦。
改:
public class longDivision {
public static void main(String[] args) {
final long A=24L*60*60*1000*1000;
final long B=24L*60*60*60*1000;
System.out.print(A/B);
}
}
這樣改就對啦。
第四:大小寫錯誤
public class elementary {
public static void main(String[] args) {
System.out.print(12345+5432l);
}
}
本次錯誤的原因是把5432l看錯啦“l(fā)”是字母“L”的小寫;切記在long類型字面常量中,一定要用大寫的“L”;
第五:進制數
public class Joyofhex{
public static void main(String[] args) {
System.out.print(Long.toHexString(0x1000000000L+0xcafebabe));
}
}
十進制字面常量具有一個很好的屬性,即所有十進制字面常量都是正的,額十六進制或是八進制字面常量并具備這個屬性,想寫一個負的十進制常量,可以使用一元取反操作符(-)連接一個十進制字面常量。以這種方式,你可以用十進制寫任何int或long型數值,不管它是正的還是負的,并且負的十進制常數可以很明確的用一個減號來標識。但是十六進制和八進制字面常量并不是這樣。他們可以具有正的以及負的數值。如果十六進制和八進制常量的最高位被置位了,那么他們就是負數。在這個過程中,數字0xcafebaba是int常量,它的最高位被置位了,那么它是一個負數,它的十進制值-889275714;
改:
public class Joyofhex{
public static void main(String[] args) {
System.out.print(Long.toHexString(0x1000000000L+0xcafebabeL));
}
}
在0xcafebabe后加上L表示長整形數相加;
第六:多重轉型
public class Multicast {
public static void main(String[] args) {
System.out.print((int)(char)(byte)-1);
}
因為byte是有符號的類型,所以在將byte數值-1轉換成char時,會發(fā)生符號擴展。作為結果char數值的16位就都被置位了,因此它等于2^16-1.即65535.
如果最初的數值類型是有括號的,就執(zhí)行符號擴展;如果它是char,那么不管它將要被轉換成什么類型,都執(zhí)行零擴展。
第七:變量賦值
public class DosEquis{
public static void main(String[] args) {
int x=1984;
int y=2001;
x^=y^=x^=y;
System.out.print("x="+x+"; y="+y);
}
}
它執(zhí)行的結果是x=0;y=1984;
在單表達式中不要對相同的變量賦值兩次。表達式如果包含對相同變量的多次賦值,就會引起混亂,并且很少能夠執(zhí)行所希望的操作。即使對多個變量進行賦值也很容易出錯。
第八:操作數轉型
public class Xiao{
public static void main(String[] args) {
char x='X';
int i=0;
System.out.println(true?x:0);
System.out.println(false?i:x);
}
}
運行程序結果是:X?? 88
這是由于在表達式中使用不同的類型操作數;在這兩個表達式中第一個表達式X是char類型的,而0和i都是int類型的;
第九:字符錯誤
public class Xiao{
public static void main(String[] args) {
System.out.println("H"+"a");
System.out.println('H'+'a');
}
}
執(zhí)行的結果是:Ha 169
編譯器在計算表達式'H''a'時,是通過我們熟知的拓寬基本類型轉換,將兩個具有字符類型數值的操作數,提升為int數值而實現的,從char到int的拓寬基本類型轉化是將16位的char數值零寬展到32位的int。對于‘H’char數值是72,而對于‘a’,char數值97,因此表達式‘H’+‘a’等價于int72+97,或169;
總結
以上是生活随笔為你收集整理的java编写代码时易出错_JAVA中易出错的小问题(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奔腾的车怎么样 了解奔腾车的性能和口碑?
- 下一篇: mysql 事物的持久性是指_详解MyS