#在千鋒“逆戰”學習第26天#異常、Question11

總結
概念:程序在運行過程中出現的特殊情況
異常處理的必要性:任何程序都可能存在大量的未知結果、錯誤;如果不對這些問題進行正確處理,則可能導致程序的中斷,造成不必要的損失。

異常的分類
Throwable:可拋出的,一切錯誤或異常的父類,位於java.lang包中
Error:JVM、硬件、執行邏輯錯誤,不能手動處理。
Exception:程序在運行和配置中產生的問題,可處理。
RuntimeException:運行時異常,可處理,可不處理。
CheckedException:受查異常,必須處理。

異常的產生
自動拋出異常:當程序運行時,遇到不符合規範的代碼或結果時,會產生異常。
手動拋出異常:語法:throw new 異常類型(“實際參數”);
產生異常結果:相當於遇到return語句,導致程序因異常而終止

異常的傳遞
異常的傳遞:按照方法的調用鏈反向傳遞,如始終沒有處理異常,最終會由JVM進行默認異常處理(打印堆棧跟蹤信息)

受查異常:throws 聲明異常,修飾在方法參數列表後端。

運行時異常:因可處理可不處理,無需聲明異常

異常的處理
在這裏插入圖片描述
常見的異常處理結構
在這裏插入圖片描述

---------------------------------------------------------------------------------作業分割線

  1. 填空
    Java 中所有的錯誤都繼承自___Throwable___類;在該類的子類中,Error___類表示嚴重的底層錯誤,對於這類錯誤
    一般處理的方式是___不處理
    ;___Exception___類表示例外、異常。

  2. 查詢 API,填空
    I. 異常類 java.rmi.AlreadyBoundException,從分類上說,該類屬於___已檢查___(已檢查|運行時)異常,從處理方式上說,對這種異常___必須___處理。
    II. 異常類 java.util.regex.PatternSyntaxException,從分類上說,該類屬於___運行時___(已檢查|運行時)異常,從處理方式上說,對這種異常___可處理可不___處理。

  3. (異常的產生)把下面代碼補充完整

public class TestThrow{
public static void main(String args[]){
throwException(10);
}
public static void throwException(int n){
if (n == 0){
//拋出一個 NullPointerException
}else{
//拋出一個 ClassCastException
//並設定詳細信息爲“類型轉換出錯”
}
}
}

答案:
在這裏插入圖片描述
在這裏插入圖片描述
4. (try-catch-finally)有如下代碼:

import java.io.*;
import java.sql.*;
class TestException{
public static void main(String args[]){
System.out.println(“main 1);
int n;
//讀入 n
ma(n);
System.out.println(“main2”);
}
public static void ma(int n){
try{
System.out.println(“ma1”);
mb(n);
System.out.println(“ma2”);
}catch(EOFException e){
System.out.println(“Catch EOFException”);
}catch(IOException e){
System.out.println(“Catch IOException”);
}catch(SQLException e){
System.out.println(“Catch SQLException”);
}catch(Exception e){
System.out.println(“Catch Exception”);
}finally{
System.out.println(“In finally);
}
}
public static void mb(int n) throws Exception{
System.out.println(“mb1”);
if (n == 1) throw new EOFException();
if (n == 2) throw new FileNotFoundException();
if (n == 3) throw new SQLException();
if (n == 4) throw new NullPointerException();
System.out.println(“mb2”);
}
}

問:當讀入的 n 分別爲 1,2,3,4,5 時,輸出的結果分別是什麼?
輸入1時:
main 1
ma1
mb1
Catch EOFException
In finally
main2

輸入2時:
main 1
ma1
mb1
Catch IOException
In finally
main2

輸入3時:
main 1
ma1
mb1
Catch SQLException
In finally
main2

輸入4時:

main 1
ma1
mb1
Catch Exception
In finally
main2

輸入5時:
main 1
ma1
mb1
mb2
ma2
In finally
main2

  1. (try-catch)代碼改錯。
class MyException{}
class TestException{
public static void main(String args[]){
ma();
}
public static int ma(){
try{
m();
return 100;
}catch(Exception e){
System.out.println(“Exception”);
}
catch(ArithmeticException e){
System.out.println(“ArithmeticException”);
}
}
public static void m(){
throw new MyException();
}
}

在這裏插入圖片描述
多重catch需要遵循從小到大的原則,所以將兩個catch位置互換
m方法中拋出的異常必須是Exception的子類
方法ma必須有返回值,所以把return 100放到finally裏面。

  1. (try-catch,局部變量)有如下代碼
public class TestTryCatch{
public static void main(String args[]){
System.out.println( ma() );
}
public static int ma(){
int n;
try{
n = 10/0;
}catch(Exception e){
}
return n;
}
}

選擇正確答案:
A. 編譯不通過
B. 編譯通過,輸出-1
C. 編譯通過,輸出 0

答案:A
因爲n=10/0賦值異常,捕獲異常後並沒有對n賦值,n相當於沒有被初始化賦值,沒法return。

  1. (try-finally)寫出下面代碼運行的結果
public class TestTryFinally{
public static void main(String args[]){
try{
ma();
}catch(Exception ex1){
}
}
public static void ma() throws Exception {
int n = 10;
int b;
//讀入一個整數 b
try{
System.out.println(“ma1”);
int result = n / b;
System.out.println(“ma2 ” + result);
}finally{
System.out.println(“In Finally”);
}
}
}

在 ma 中,讀入整數 b,如果讀入的值爲 10,則輸出: ma1,ma2 1,In Finally 。如果讀入的值爲 0,則輸出: ma1 ,In Finally

  1. (異常的捕獲和拋出)有以下代碼
public class TestException{
public static void main(String args[]){
try{
System.out.println(“main1”);
ma();
System.out.println(“main2”);
}catch(Exception e){
System.out.println(“In Catch”);
}
}
public static void ma(){
System.out.println(“ma1”);
throw new NullPointerException();
System.out.println(“ma2”);
}
}

選擇正確答案:
A. 編譯出錯
B. 編譯正常,輸出 main1 ma1 In Catch
C. 編譯正常,運行時出錯

答案:C
拋出空指針異常下面那行System.out.println(“ma2”);是執行不到的代碼,編譯會報錯。

  1. (異常的捕獲和拋出)有如下代碼
import java.io.*;
import java.sql.*;
class TestException{
public static void main(String args[]){
try{
ma();
}
/*1*/
catch(Exception e){
}
}
public static void ma() throws IOException{ }
}

下面哪些代碼放在/1/處可以編譯通過?
A. catch(NullPointerException npe){}
B. catch(IOException ioe){}
C. catch(SQLException sqle){}

答案:A B
在這裏插入圖片描述
C不能通過是因爲SQLException是數據庫訪問錯誤或其他提供信息的異常
通常是因爲:
1、應用程序無法連接數據庫
2、要執行的查詢存在語法錯誤
3、查詢中所使用的表/列不存在
4、試圖插入或更新的數據違反了數據庫的約束

可見try塊裏的代碼是不會發生這些異常的,所以不會拋出SQLException異常,編譯不通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章