Java 棘手輸出問題
Java 棘手輸出問題很難回答,需要付出更多努力。如果我們試圖用常識來回答一個具有挑戰性的問題,我們會力不從心,因為這些問題需要專業的理解。大多數具有挑戰性的 Java 問題都基於一些令人困惑的概念,例如迴圈、多執行緒、過載、重寫等。
即使一個問題並不特別具有挑戰性,我們有時也會難以解決它。儘管問題的答案很簡單,但我們有時會粗心地編寫程式碼。
即使我們不知道解決方案,我們仍然可以使用分析性思維來獲得答案。在本文中,我們將討論一些具有挑戰性的 Java 棘手輸出問題。
常見 Java 棘手輸出問題
問題
考慮以下輸出並嘗試猜測答案
public class A { public static void main(String args[]) { //\u000d System.out.println("hello"); } }
Hello
hello
HELLO
Error
\u000d
答案
輸出將是“hello”。Unicode 字元 \u000d 是回車符,充當換行符。因此,註釋行被解釋為新的一行程式碼。
問題
嘗試猜測以下輸出的答案
String s1 = "Java"; String s2 = "Java"; StringBuilder sb1 = new StringBuilder(); sb1.append("Ja").append("va"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); System.out.println(sb1.toString() == s1); System.out.println(sb1.toString().equals(s1));
true 恰好列印一次。
true 恰好列印兩次。
true 恰好列印三次。
true 恰好列印四次。
Error
答案
輸出將是“true 恰好列印四次”。== 運算子比較兩個引用是否指向完全相同的物件,而 equals() 方法檢查兩個物件的內容是否等效。Java 中的字串字面量會被駐留,因此 s1 和 s2 指向同一個物件。StringBuilder 會生成一個新的 String 物件,所以 sb1.toString() != s1,但其內容與 s1 相同。
問題
回答以下問題
public class Demo { public static void main(String args[]) { System.out.print("a"); try { System.out.print("b"); throw new IllegalArgumentException(); } catch (RuntimeException e) { System.out.print("c"); } finally { System.out.print("d"); } System.out.print("e"); } }
abe
abce
abde
abcde
丟擲未捕獲的異常
答案
輸出將是“abcde”。即使 try 塊中丟擲異常,finally 塊也將始終執行。
問題
考慮以下問題來猜測答案
public class Test { public static void main(String args[]) { int i=20+ +9- -12+ +4- -13+ +19; System.out.println(i); } }
27
33
66
76
77
答案
輸出將是“77”。一元加號和減號運算子的優先順序高於二元加號和減號運算子,一元加號不會改變其運算元的符號。
問題
考慮以下程式碼來回答
public class Actors { Public static void main(String arg[]) { char[] ca ={0x4e, \u004e, 78}; System.out.println((ca[0] = = ca[1]) + " "+ (ca[0] = = ca[2])); } }
false false
true true
false true
true false
Error
答案
輸出將是“true true”。字元陣列中的所有三個元素都表示相同的數值 (78),因此比較結果為 true。
問題
以下程式碼的輸出是什麼
public class _C { private static int $; public static void main(String main[]) { String a_b; System.out.print($); System.out.print(a_b); } }
第 4 行編譯錯誤
第 2 行編譯錯誤
第 1 行編譯錯誤
第 5 行編譯錯誤
第 8 行編譯錯誤
答案
輸出將是“第 5 行編譯錯誤”。區域性變數必須在使用前初始化。
問題
給定程式碼的答案是什麼
switch(x) { case x>70: System.out.println("True"); break; case 65<x<=70: System.out.println("False"); break; }
斷言錯誤
堆疊溢位
孤立的 case
IO 錯誤
記憶體錯誤輸出
答案
輸出將是“孤立的 case”。switch 語句中的 case 標籤必須是常量表達式(通常是整數、列舉或字串字面量),而不是布林表示式。
問題
考慮以下程式碼來回答
public class Demo { static int x=1111; static { x=x-- - --x; } { x=x++ + ++x; } public static void main(String args[]) { System.out.println(x); } }
2
1110
1109
1
11
答案
輸出將是“2”。靜態塊在例項初始化塊之前執行,兩個塊都會更改 x 的值。
問題
以下程式碼的輸出是什麼
import java.lang.Math; public class Example { public static void main(String args[]) { String computerMove; switch ( (int)(3*Math.random()) ) { case 0: computerMove = "Rock"; break; case 1: computerMove = "Scissors"; break; case 2: computerMove = "Paper"; break; } System.out.println("Computer's move is " + computerMove); } }
紙
石頭
剪刀
語法錯誤
異常
答案
輸出可能是“紙”、“石頭”或“剪刀”。switch 語句隨機選擇三個 case 之一。
問題
考慮以下程式碼給出答案
public class TestHashMap { public static void main(String[] args) { HashMap<String,String> map = new HashMap<String,String>(){ { put("1", "ONE"); } { put("2", "TWO"); } { put("3", "THREE"); } }; Set<String> keySet = map.keySet(); for (String string : keySet) { System.out.println(string+" ->"+map.get(string)); } } }
不允許在 Java 中使用雙大括號初始化。
第一組大括號建立一個新的匿名內部類,第二組大括號建立一個類似於類中靜態塊的例項初始化。
第二組大括號建立一個新的匿名內部類,第一組大括號建立一個類似於類中靜態塊的例項初始化。
第一組大括號既沒有建立匿名內部類,第二組大括號也沒有建立類似於類中靜態塊的例項初始化。
以上都不是
答案
正確答案是“第一組大括號建立一個新的匿名內部類,第二組大括號建立一個類似於類中靜態塊的例項初始化”。這種模式被稱為雙大括號初始化。
問題
編譯以下程式碼後會得到什麼?
public class ExceptionDemo { public static void main(String args[]) { Object x[] = new String[3]; x[0] = new Integer(0); } }
負陣列大小異常
陣列儲存異常
空指標異常
類轉換異常
陣列索引越界異常
答案
輸出將是“陣列儲存異常”。陣列的執行時型別是 String[],因此它不能儲存 Integer 物件。
問題
考慮這種情況
If we put System.exit(0) on try to catch block in such a case Will finally block execute or not? Also specify the reason
它跳過 finally 塊。
這是一個無效的情況。
finally 塊可能執行也可能不執行。
JVM 以 SecurityException 退出並執行 finally 塊。
JVM 以 SecurityException 退出,並且不會執行 finally 塊。
答案
正確答案是“JVM 以 SecurityException 退出,並且不會執行 finally 塊”。System.exit(0) 會立即終止 JVM,因此 finally 塊不會執行。
問題
考慮以下程式碼給出正確的答案
import java.util.Arrays; public class SplitString { public static void main(String args[]) { String str="Java|Python|Hadoop"; String[] array = str.split("\|"); System.out.println(Arrays.toString(array)); } }
[Java\Python\Hadoop]
[Java|Python|Hadoop]
[Java\|Python\|Hadoop]
[Java, Python, Hadoop]
答案
輸出將是“[Java, Python, Hadoop]”。split() 方法使用正則表示式分割字串,而 | 是需要轉義的元字元。
問題
評估以下語句
long longWithL = 1000*60*60*24*365L; long longWithoutL = 1000*60*60*34*365;
編譯時錯誤
算術異常
31536000000 和 1726327040
3.1536e10 和 1.72632704e9
31536000000L 和 1726327040
答案
正確答案是“31536000000 和 1726327040”。L 字尾使第一個數字成為長整型字面量,因此計算不會溢位。第二個數字作為 int 計算並溢位。
問題
評估以下程式碼並仔細給出答案
class Base{ public static void main(String[] args){ System.out.println("Hello"); } } public class Test extends Base{}
編譯時錯誤
執行時錯誤
編譯並執行,無輸出
編譯並執行,列印 hello
第 6 行錯誤
答案
輸出將是“編譯並執行,列印 hello”。main 方法繼承自 Base 類,並在執行 Test 類時執行。
結論
熟悉一些常見問題至關重要。透過練習,您在回答問題或開發測試程式碼時可能會更有信心。儘管他們可能會問各種問題,但您可以提前準備好答案來提高您的 Java 專業知識。