程式語言與編程實踐7-> Java實操4 | 第三周作業及思路講解 | 異常處理考察

来源:https://www.cnblogs.com/Roboduster/archive/2022/03/30/16077462.html
-Advertisement-
Play Games

Java課程的第三周作業,重點考察了異常的處理,其中第9題比較有意思,是對自定義異常類的繼承問題。 ...


第三周作業,可能是異常那一章當時沒怎麼聽,此前也不怎麼接觸,感覺還挺陌生的。

00 第1題

00-1 題目

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author zzrs123
 */
public class Homework_week3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int a=0, b=5;
        try{
            System.out.print(a/b+b/a);
        }
        catch
        {
            System.out.println("Exceptions!!!"); 
        }
    }
}

編譯以上代碼,會出現什麼錯誤?

A. Prints: Exceptions!!! 
B. Prints Nothing 
C. Syntax error 
D. Runtime Error 
E. None of the above 

00-2 解答

Answer: D

catch處語法出錯,導致不能編譯: Uncompilable source code - 非法的類型開始;

如果改為:

catch (ArithmeticException e){
	System.out.println("Exceptions!!!"); 
}

那麼就會輸出Exceptions!!!

考察的是try + catch + finally異常捕獲機制的語法:如果try{}拋出的對象屬於 catch() 括弧內欲捕獲的異常類,則 catch() 會捕捉此異常,然後進到 catch() 的塊里繼續運行。

01 第2題

01-1 題目

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author zzrs123
 */
public class Homework_week3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int a=0, b=5;
        String c[] = {"A","B","C"};
        try{
            for(int i = 1;i < 4; i++){
                System.out.print(c[i]);
            }
            System.out.print(a/b+b/a);
        }
        catch (ArithmeticException e)
        {
            System.out.println("D"); 
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            System.out.println("E");
        }
    }
}

編譯並執行代碼,會出現哪種結果?

A. Prints: ABC 
B. Prints: ABD 
C. Prints: BCE 
D. Prints: BCDEE. Compiler Error 

01-2 解答

**Answer: **C

這道題就考察了try + catch + finally的運行機制,檢測到for迴圈里出現數組下標溢出,就拋出異常,產生中斷,接著匹配到第二個catch語句塊catch(ArrayIndexOutOfBoundsException),輸出E

考察的是try + catch + finally異常捕獲機制的捕獲到異常立刻中斷,進入異常處理。

02 第3題

02-1 題目

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author zzrs123
 */
public class Homework_week3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int a=0, b=5;
        String c[] = {"A","B","C"};
        try{
            System.out.print(c[a/b]);
            try{
                for(int i = 1;i < 4; i++){
                    System.out.print(c[i]);
                }
            }
            catch (Exception e)
            {
                System.out.println("D"); 
            }
            finally{
                System.out.println("E");
            }
        }
        
        catch(Exception e)
        {
            System.out.println("F");
        }
        finally{
            System.out.println("G");
        }
    }
}

編譯並執行代碼,會出現哪種結果?

A. Prints: AABCG 
B. Prints: ABCDG 
C. Prints: AABCDG 
D. Prints: AABCDEG 
E. Prints: AABCDEFG

02-2 解答

Answer: D

兩個try + catch + finally的嵌套,考察的知識是:

" 無論 try 程式塊是否有捕捉到異常,或者捕捉到的異常是否與 catch()括弧里的異常相同,最後一定會運行 finally 塊里的程式代碼。finally 的程式代碼塊運行結束後,程式再回到 try-catch-finally 塊之後繼續執行。"

03 第4題

03-1 題目

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author zzrs123
 */
public class Homework_week3 {

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args ) {
         int src[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
         int res[] = {1, 2, 3, 4, 5}; 
         System.arraycopy(src, 0, res, 0, src.length);
         for(int i=0; i<res.length; i++) {
             System.out.print(res[i]);
         }
     }
}

What is the result?

A. 10987654321 
B. 10987612345 
C. 12345612345 
D. Compiler error 
E. Runtime exception 

03-2 解答

Answer: E

很明顯,這裡的語句都符合語法,所以Compiler error可以排除;

arraycopy()函數的語法:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

參數說明:

  • Object src : 原數組
  • int srcPos : 拷貝到原數組的起始位置
  • Object dest : 目標數組
  • int destPos : 目標數組的開始起始位置
  • int length : 要copy的數組的長度

題目中,要向長度為5的數組放入10個元素,所以運行到這個函數的時候,會發生越界錯誤,採取java預設的異常處理機制,直接拋出異常中斷:ArrayIndexOutOfBoundsException

04 第5題

04-1 題目

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author zzrs123
 */
public class Homework_week3 {

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args ) {
         byte a[] = new byte[2];
         long b[] = new long[2];
         float c[] = new float[2];
         Object d[] = new Object[2];
         System.out.print(a[1]+","+b[1]+","+c[1]+","+d[1]);
     }
}

編譯並執行代碼,會出現哪種結果?

A. Prints: 0,0,0,null 
B. Prints: 0,0,0.0,null 
C. Prints: 0,0,0,0 
D. Prints: null,null,null,null 
E. The code runs with no output.

04-2 解答

Answer: B

在new一個數組的時候,預設初始化為0,當然,這種初始化契合於數據類型,比如float要初始化為0.0,Object初始化為null

05 第6題

05-1 題目

1. class A {
2.     public static void main(String[] args) {
3.         int[ ] var1;
4.         int[5] var2;
5.         int[] var3;
6.         int var4[];
7.         }
8.     }

編譯並執行代碼,會出現哪種結果?

A. compile-time errors occur at line 3 
B. compile-time errors occur at line 4
C. compile-time errors occur at line 5 
D. compile-time errors occur at line 6 
E. None of the above 

05-2 解答

Answer: B

這兩道題考察的都是數組的聲明分配記憶體初始化

一維數組的聲明與分配記憶體:

  1. 數據類型 數組名[ ] ; // 聲明一維數組
  2. 數組名 = new 數據類型[個數] ; // 分配記憶體給數組

聲明數組的同時分配記憶體:

  • 數據類型 數組名[] = new 數據類型[個數]

06 第7題

06-1 題目

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author zzrs123
 */
public class Homework_week3 {

    /**
     * @param args the command line arguments
     */
    static void my() throws ArithmeticException {
         System.out.print("A");
         throw new ArithmeticException("A");
          }
     public static void main (String args []) {
         try { 
             my();
         }
         catch (Exception e) {
             System.out.print("B");
             }
         finally {
             System.out.print("C");
             }
         }
}

編譯並執行代碼,會出現哪種結果?

A. Prints: A 
B. Prints: AC 
C. Prints: ABC 
D. Prints: AABC 
E. Prints: C 

06-2 解答

Answer: C

考察的是throw指定方法拋出異常的知識:

  1. 用處:

    如果方法內的程式代碼可能會發生異常,且方法內又沒有使用任何的代碼塊來捕捉這些異常時,則必須在聲明方法時一併指明所有可能發生的異常,以便讓調用此方法的程式得以做好準備來捕捉異常。也就是說,如果方法會拋出異常,則可將處理這個異常的 try-catch-finally 塊寫在調用此方法的程式代碼內。

  2. 語法:方法名稱(參數…) throws 異常類 1,異常類 2,…

  3. 具體執行:

    throws 在指定方法中不處理異常,在調用此方法的地方處理,如果指定方法中異常,則在調用處進行處理(進入catch()

所以這道題的運行過程為:main函數-> try()塊-> my函數-> 輸出A -> new ArithmeticException(“A”)-> catch()-> 輸出B-> finally()-> 輸出C

07 第8題

07-1 題目

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author zzrs123
 */
class B extends Exception {}
class C extends B {}
class D extends C {}
public class Homework_week3 {
     /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        int a,b,c,d,x,y,z;
        a = b = c = d = x = y = 0;
        z = 1;
        try {
            try {
                switch(z) {
                   case 1: throw new B();
	           case 2: throw new C();
                   case 3: throw new D();
                   case 4: throw new Exception();
                }
                a++;//a=0
            }
            catch ( C e ) {b++;}//b=0
            finally{c++;}//c=1
        }
        catch ( B e ) {d++;}//d=1
        catch ( Exception e ) {x++;}//x=0
        finally {y++;}//y=1
        System.out.print(a);
        System.out.print(b);
        System.out.print(c);
        System.out.print(d);
        System.out.print(x);
        System.out.print(y);
    }
}

編譯並執行代碼,會出現哪種結果?

A. 0,0,1,1,0,1 
B. 0,1,0,1,1,0 
C. 0,0,1,1,0,1 
D. 0,1,1,1,1,1 
E. 1,1,0,1,0,0 

07-2 解答

Answer: AC

這道題的亮點是異常類的層層繼承,人腦運行的關鍵在於:如果報了一個類的錯誤,那麼catch其父類和子類的塊會不會響應。

答案是不會catch只能識別錯誤本身。

此外就是運行到case 1: throw new B();時,程式就中斷,直接進入catch()區,不會運行a++

08 第9題

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package homework_week3;

/**
 *
 * @author shandaiwang
 */

   
1.class B extends Exception {
2.    public void myMethod( ) throws RuntimeException {}
3.}
4.
5.public class Homework_week3 extends B {
     /**
     * @param args the command line arguments
     */
6.      public void myMethod( ) throws Exception {}
7.      public static void main (String[] args) {}
8.}

編譯錯誤會出現在哪一行?

A. 1 
B. 2 
C. 6 
D. 7 
E. None of the above

08-2 解答

Answer: C

0330 這個問題不是很明白,還是編譯錯誤,所以也很難從IDE得到點什麼,查了查,有兩點:

  1. 子類中覆蓋方法的訪問許可權不能比父類小,比如父類的myMethod( )是public類型,子類的不能是private。
  2. 子類中覆蓋方法拋出的異常只能比父類中原方法拋出的異常低級,比如父類拋出Exception,而子類的覆蓋方法只能拋出RuntimeException之類的子異常。

09 第10題

09-1 題目

class A {
    public static void main (String[] args) {
        int a=1, b=0;
        int c[] = {1,2,3};
        try { 
            System.out.print(c[1]);
            try {
                System.out.print(a/b+b/a);
            }
            catch (ArithmeticException e){
                System.out.print(“C”); 
            } 
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.print(“A”); 
        } 
        finally { 
            System.out.print(“B”);
        }
    }
}

編譯並執行代碼,會出現哪種結果?

(A) 1BC 
(B) 1CB 
(C) 2BC 
(D) 2CB 
(E) 2AC 

09-2 解答

Answer: D

這道題相對常規,是一個try-catch-finally的嵌套問題,

System.out.print(c[1]);
try {
    System.out.print(a/b+b/a);
}
catch (ArithmeticException e){
    System.out.print(“C”); 
} 

正常輸出c[1] 為2,然後進入內層的 try,發現異常,捕獲輸出 C,接著出來進入外層 try 的catch,未捕獲異常,進入外層的 finally ,輸出 B 。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python如何加密解密?感興趣的小伙伴可以舉一下腳,我看看有多少。咳咳咳,正式開始了,今天給大家分享的是Python如何加密解密,感興趣的小伙伴要認真學起來。 前言 加密演算法主要分為:哈希演算法、對稱加密演算法、非對稱加密演算法。 •哈希演算法:MD5、SHA256 •對稱加密演算法:DES、AES、CBC ...
  • 一、需求:創建一個HashMap集合,鍵是學號(String),值是學生對象(Student),存儲三個鍵值對元素,並遍歷 分析: 1.定義學生類 2.創建HashMap集合對象 3.創建學生對象 4把學生添加到集合中 5.遍歷集合 public class StudentDemo { public ...
  • 前言: 請各大網友尊重本人原創知識分享,謹記本人博客:南國以南i 上篇我們介紹到 保姆教程系列一、Linux搭建Nacos 註冊中心原理 一、環境準備 Java版本:1.8+ (Linux centos7虛擬機下安裝Jdk1.8) MySQL服務:5.6.5+ (Linux Centos7 安裝My ...
  • 遞歸:方法定義中調用方法本身的現象 註意事項: * A:遞歸一定要有出口,否則就是死遞歸 * B:遞歸的次數不能太多,否則就記憶體溢出 * C:構造方法不能遞歸使用 階乘案例 package cn.itcast_02; /* * 需求:請用代碼實現求5的階乘。 * 下麵的知識要知道: * 5! = 1 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 另有一篇我的字元編碼本質入門的文章見這裡:https://www.cnblogs.com/uncleguo/p/16008551.html 實話說,作為一個多年Java老年程式員,直到近來,在沒有決心花時間搞清楚Java String的編碼相關問題之前, 自己也都還是似懂非懂,一臉懵逼的。設想如果在 ...
  • 一、前言 好想看電視啊!!沒有會員,怎麼辦啊?想線上觀看或下載愛奇藝、PPTV、優酷、網易公開課、騰訊視頻、搜狐視頻、樂視、土豆、A站、B站等主流視頻網站的VIP視頻?又不想充會員怎麼辦?今天給你分享Python小技巧,實現你的VIP看電視的夢想。 PS:本軟體只用來交流學習,請勿用於商業用途。如涉 ...
  • 要求:通過 jQuery 優化網站源代碼中的發送 Ajax 請求部分 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...