91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java開發者遇到的問題有哪些

發布時間:2022-01-06 21:16:55 來源:億速云 閱讀:219 作者:iii 欄目:編程語言

這篇文章主要講解了“Java開發者遇到的問題有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java開發者遇到的問題有哪些”吧!

1、Java“死亡競賽”中最難的問題

讓我們從最難啃的骨頭開始吧。這個問題由來自羅馬尼亞首都布加勒斯特的 Alexandru-Constantin Bledea提供。這個問題確實是一個腦筋急轉彎,只有約20%的參與者答對這道題,這意味著瞎選都能提高你回答正確的概率。這道題是關于Java泛型的。

Java開發者遇到的問題有哪些

題目大意:

這段代碼錯在哪兒?

a.編譯錯誤,因為沒有SQLException被拋出

b.拋出ClassCastException,因為SQLException并不是RuntimeException的一個實例

c.沒有錯誤,程序打印出拋出的SQLException堆棧跟蹤信息

d.編譯錯誤,因為我們不能將SQLException類型轉換成RuntimeException

好,我們能從題目中得到什么信息?題目中的泛型涉及到了類型擦除,以及一些異常。這里需要回憶一些知識:

RuntimeException和SQLException都繼承自Exception,但是在這個代碼中RuntimeException是未檢查的異常,而SQLException是受檢異常。

2.Java的泛型并不是具體化的。這意味著在編譯時,泛型的類型信息會“丟失”,并且泛型參數像是被它的限定類型替換了一樣,或者當限定類型不存在時,泛型參數被替換成了Object。這就是大家所說的類型“擦除”。

我們天真地希望第七行能產生一個編譯錯誤,因為我們不能將SQLException轉換成RuntimeException,但是這并不會發生。發生的是將T替換成了Exception,所以我們有:

throw (Exception) t; // t is also an Exception

pleaseThrow方法期望一個Exception,并且T被替換成了Exception,因此類型轉換被擦除了,就像沒寫這個代碼一樣。這一點我們可從下面的字節碼中得到佐證:

private pleaseThrow(Ljava/lang/Exception;)V throws java/lang/Exception

L0

LINENUMBER 8 L0

ALOAD 1

ATHROW

L1

LOCALVARIABLE this LTemp; L0 L1 0

// signature LTemp<TT;>;

// declaration: Temp<T>

LOCALVARIABLE t Ljava/lang/Exception; L0 L1 1

MAXSTACK = 1

MAXLOCALS = 2

我們再看一下,如果代碼中沒有涉及泛型,那么編譯產生的字節碼是什么樣的,我們看到,在ATHROW前會有如下的代碼:

CHECKCAST java/lang/RuntimeException

現在,我們可以確信,代碼中并沒有涉及到類型轉換,因此我們可以排除下面這兩個選項:

“編譯錯誤,因為我們不能將SQLException類型轉換為RuntimeException”

“拋出ClassCastException,因為SQLException不是RuntimeException的一個實例”

因此畢竟我們拋出了SQLException,然后你希望它能被catch代碼塊捕獲,然后打印它的堆棧跟蹤信息。然而,事與愿違。

這個代碼具有欺騙性,它使得編譯器和我們一樣變得困惑。這段代碼讓編譯器認為catch代碼塊是不能到達的。對于不知情的旁觀者來說,代碼中并沒有 SQLException。所以,正確答案是:編譯失敗,因為編譯器認為SQLException不會從try代碼塊中拋出-但是實際上它確實能拋出!

再次感謝Alexandru與我們分享這個問題!我們可以用另一個很酷的方式來查看代碼中的錯誤以及SQLException實際上是怎樣拋出的,這個方法是:修改catch代碼塊,把它修改為接收一個RuntimeException。這樣你就可以看到SQLException的堆棧信息了。(實際上SQLException也并沒有被catch代碼段捕獲,而是被虛擬機捕獲并打印出異常棧的信息。)

2、問題的關鍵在于,是否使用了toString()

Java開發者遇到的問題有哪些

這道題只有24%的正確率,它的困難程度是這20道題中的亞軍。

題目大意:這個程序的打印結果是?

a.m1 & new name

b.以上都是錯誤的

c.m1&m1

d.new name & new name

這道題實際上簡單得多,我們只要看到第十二行,它直接打印了m1和m2,而不是m1.name和m2.name。這段代碼狡猾的地方在于,當我們要 打印一個對象時,Java使用的是toString方法。“name”屬性是我們自己加入的,如果你忘記這點,其他地方都判斷正確的話,你可能會錯誤地選 擇m1&new name這個答案。

這行代碼將兩個對象的name屬性都賦值為”m1”。

m1.name = m2.name = “m1";

然后callMe方法將m2對象的name屬性設置成”new name”,然后代碼就結束了。

但是,這個代碼片段實際上將會打印出如下信息,包括類名稱以及它們的哈希碼:

MyClass@3d0bc85 & MyClass@7d08c1b7

所以正確的答案是“None of the above”

3、Google Guava類庫中的Sets

Java開發者遇到的問題有哪些

題目大意:

這道題目不妥的地方在哪?

a.不能編譯

b.沒有問題

c.可能造成內存溢出

d.可能造成***循環

這個問題實際上并不特別需要關于Guava sets類庫的專業知識,但卻使絕大多數的開發者產生困惑。只有25%的參與者給出了正確的答案,和瞎選的正確率是一樣的。

那么我們能從這段代碼中看出什么呢?我們有一個方法,它返回一個集合,這個集合包含了某個人的好友圈。方法中有一個循環,它檢查一個person對 象的bestfriend屬性是否為null。如果不為null,則將bestfriend添加到results集合里。如果一個person對象確實有 一個bestfriend,那么對這個person的bestfriend,重復執行上述過程,所以我們就可以一直向bestfriend集合添加 person對象,直到有一個person,它沒有bestfriend,或者它的bestfriend已經在我們的result集合里了。***這部分有 一點微妙,我們不能向這個Set集合添加重復的元素,即person對象,所以這個方法并不會導致***循環。

真正的問題在于,這段代碼很有可能造成內存用盡的異常(out of memory exception)。這個循環實際上是沒有邊界的,所以我們可以不停地往set中添加person對象,直到內存用盡。

順便提一下,如果你想詳細了解Google Guava,可以看看我們寫的這篇博客: the lesser known yet useful features about it

4、利用兩個花括號進行初始化

Java開發者遇到的問題有哪些

題目大意:這段代碼錯誤的地方在哪?

a.沒有錯誤

b.可能獲得null值

c.代碼不能編譯

d.打印出不正確的結果

這個問題是代碼最少的問題之一,但是足以迷惑絕大部分的開發者。這道題只有26%的答題者回答正確。

很少有開發者知道這個初始化常量集合的簡便語法,雖然這個語法會帶來一些副作用。但事實上,這個語法鮮為人知未免不是一件好事。在感嘆之后,你看 到,我們往list里添加了一個元素,然后打印這個list。正常情況下,你期望看到打印的結果是[John],但是利用兩個花括號進行初始化是有另一套 初始化過程的。這里,我們用了一個匿名類來初始化一個List,當要打印NAMES時,實際上打印出來的是null,這是因為初始化程序尚未完成,此時的 list是空的。

關于使用兩個花括號進行容器的初始化,可參考這里(right here)。

5、對于運行時Map容器的離奇事件

這是另一個社區貢獻的問題,貢獻者是來自以色列的Barak Yaish。只有27%的答題者能解答這個問題。

Java開發者遇到的問題有哪些

題目大意:這段代碼的輸出是什么

a.不能編譯

b.類型轉換異常

c.[] true

d.[“bar”, “ber”]

好吧,來看看代碼。compute方法通過key在map中查找一個value。如果這個value是null,則插入(key,  value),并返回value。因為開始時,這個list是空的,“foo”值并不存在,v是null。然后,我們向map中插入一個“foo”并且 “foo”指向new ArrayList<Object>(),此時的ArrayList對象是空的,所以它打印出[]。

下一行,“foo”鍵值存在于map容器中,所以我們計算右邊的表達式。ArrayList對象成功轉換為List類型,然后“ber”字符串被插入到List中。add方法返回true,因此true就是第二行打印的內容。

所以正確的答案是”[]true”。再次感謝Barak于我們分享這道題。

鼓勵一下:來看看最簡單的題吧

Java開發者遇到的問題有哪些

題目大意:哪一種方法是初始化Java字符串最簡單的方式

a.A

b.沒有一個

c.C

d.B和C不能編譯

現在,我們來看一下Peter Lawrey提供的問題。他工作于OpenHFT開源項目,同時也在Vanilla Java上撰寫博客。Peter在StackOverflow上排名top 50,這一次他反過來向大家提問,76%的開發者能回答出這個問題。

C答案比A簡單,B和D是不能編譯的。

感謝各位的閱讀,以上就是“Java開發者遇到的問題有哪些”的內容了,經過本文的學習后,相信大家對Java開發者遇到的問題有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扶沟县| 沂水县| 修武县| 合作市| 阿拉尔市| 娄底市| 霞浦县| 睢宁县| 青龙| 来宾市| 平定县| 漯河市| 灵丘县| 榆社县| 丹阳市| 铜陵市| 凤凰县| 饶平县| 普安县| 札达县| 乐亭县| 家居| 哈密市| 忻州市| 东光县| 城市| 沙湾县| 清丰县| 灵武市| 陵水| 大竹县| 石泉县| 樟树市| 长岭县| 唐海县| 罗定市| 宝坻区| 高密市| 哈尔滨市| 望谟县| 和硕县|