日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java五道输出易错题解析(进来挑战下)

發布時間:2025/3/21 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java五道输出易错题解析(进来挑战下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

收集了幾個易錯的或好玩的Java輸出題,分享給大家,以后在編程學習中稍微注意下就OK了。

1. 看不見的空格?
下面的輸出會正常嗎?

package basic;
?
public class IntegerTest {
?
? ? public static void main(String[] args) {
? ? ? ? System.out.println(Integer.parseInt("1"));
? ? ? ? System.out.println(Integer.parseInt("2"));
?}
}
解析:將上面代碼復制下(不要自己手敲)在自己的環境里運行看看,是不是輸出下面錯誤來了:

1
Exception in thread "main" java.lang.NumberFormatException: For input string: "2"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at basic.IntegerTest.main(IntegerTest.java:7)

竟然說第二條語句有問題,表面上完全看不出來任何問題是不是!
實際上這里的錯誤原因涉及到一個概念 —?零寬度空格,可能有人接觸過,但相信更多的人甚至都沒聽過,什么是零寬度空格?它實際上是一個Unicode字符,是一個空格,關鍵是它沒有寬度,因此我們一般肉眼看不到。但可以在vim下看到,上面的第二條語句中的2前面就有一個零寬度空格,放到vim中打開后你會發現是下面這樣的語句:

?System.out.println(Integer.parseInt("<feff>2"));
Unicode規范中定義,每一個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做”零寬度非換行空格“(ZEROWIDTHNO-BREAKSPACE),用FEFF表示。這正好是兩個字節,而且FF比FE大1。因此下面的語句會輸出65279,剛好是FEFF。

System.out.println((int)"2".charAt(0));
2. 類靜態成員初始化
下面的程序能編譯通過么?如果通過,說結果并解釋,不能編譯,說錯誤原因。

class A
{
? ? public static int X;
? ? static { X = B.Y + 1;}
}
public class B
{
? ? public static int Y = A.X + 1;
? ? static {}
? ? public static void main(String[] args) {
? ? ? ? System.out.println("X = "+A.X+", Y = "+B.Y);
? ? }
}
解析:這個程序能正確運行,類的運行過程如下:

首先加載主類B,初始化靜態成員Y,發現需要類A的信息,于是加載類A,初始化靜態成員X,也用到B類信息,由于此時B類的Y還未成功加載因此這里是默認值0,從而得到A類的X為1,然后返回到B類,得到Y為2。

3. 裝箱拆箱的實際過程
關于自動裝箱,相信大部分人都明白是怎么一回事,但真的完全明白了嘛?
先看下面的代碼:

Short s1 = 1;
Short s2 = s1;
System.out.println(s1 == s2);
誰都知道當然打印true了。現在加一句試試:

Short s1 = 1;
Short s2 = s1;
s1++;
System.out.println(s1 == s2);
還是true嗎?No,這次輸出成了false。WHY?難道s1和s2引用的不是同一個對象嗎?有這些疑問的說明你對自動裝箱拆箱的過程還不是非常清楚,實際上上面的代碼可以翻譯為下面的代碼(實際執行過程,要掌握):

Short s1 = new Short((short)1);
Short s2 = s1;
short tempS1 = s1.shortValue();
tempS1++;
s1 = new Short(tempS1);
System.out.println(s1 == s2);
哦,原來如此,這下明白了,因此我們在使用自動裝箱的時候小心點為妙。

4. 你自以為是的異常
先來兩句代碼:

NullTest myNullTest = null;
System.out.println(myNullTest.getInt());
相信很多人看到這段代碼時,都會自以為是的說:NullPointerException。果真如此嗎?你還沒看到NullTest 這個類是如何定義的呢。現在看看這個類的定義:

class NullTest {
? ? ?public static int getInt() {
? ? ? ? ?return 1;
? ? ?}
}
由于getInt()是靜態方法,他只和類相關,和具體的對象無關,類完成加載時,即可通過類名.getInt()進行調用,因此這里就算對象實例為NULL也會正常輸出1.
記住:類變量和類方法的使用,僅僅依賴引用的類型。即使引用為null,仍然可以調用。從良好實踐的角度來看,明智的做法是使用NullTest.getInt()來代替myNullTest.getInt(),但誰不不能保證不會碰到這樣的代碼,因此還是小心為妙。

5. 變長參數和數組,如何變通?
變長參數特性帶來了一個強大的概念,可以幫助開發者簡化代碼。不過變長參數的背后是什么呢?Basically,就是一個數組。

public void calc(int... myInts) {}?
calc(1, 2, 3);
編譯器會將前面的代碼翻譯成類似這樣:

int[] ints = {1, 2, 3};
calc(ints);
不過這里有兩點需要注意:

當心空調用語句,這相當于傳遞了一個null作為參數。
calc();
等價于
int[] ints = null;
calc(ints);
當然,下面的代碼會導致編譯錯誤,因為兩條語句是等價的:
public void m1(int[] myInts) { ... }
public void m1(int... myInts) { ... }
參考資料
零寬度空格
————————————————
版權聲明:本文為CSDN博主「小敏紙」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lanxuezaipiao/article/details/41985243

總結

以上是生活随笔為你收集整理的Java五道输出易错题解析(进来挑战下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。