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 專業知識。

更新於:2024年5月31日

6000+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告