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