sqlserver複製oracle的表,SQLServer資料庫的複製表及資料的兩種方法
我的部落格
何為異常
異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。
說得簡單通俗點就是報錯。
異常分類
這兩張圖可以讓我們全面看到報錯的型別。
Error
Error
是程式無法處理的錯誤,表示執行應用程式中較嚴重問題。大多數的錯誤與程式碼編寫所執行的操作是沒有什麼關係的,而表示程式碼執行的時候Java虛擬機器出現的系列問題。
常見的有虛擬機器錯誤、記憶體溢位、執行緒死鎖等,這些錯誤往往是不可查的,因為它們在應用程式的控制和處理能力之外,而且絕大多數是程式執行時不允許出現的狀況。
對於設計合理的應用程式來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。
所以,我們的異常處理機制,一般可不是對於Error
的報錯的。
Exception
-
Exception
是程式本身可以處理的異常。異常處理通常指的是針對這類異常的處理。 -
Exception
類的異常包括Unchecked Exception
和Checked Exception
。 -
Unchecked Exception
(非檢查異常):編譯器不要求強制處理的異常,包含RuntimeException
以及它的相關子類。 -
Checked Exception
(檢查異常):編譯器要求必須處理的異常,除了RuntimeException
以及它的相關子類其他的Exception
子類都是檢查異常,如IOException
SQLException
。
如何處理異常
異常處理
在Java應用程式中,異常處理機制為:丟擲異常、捕獲異常
我們經常看到執行程式程式碼,如果出現錯誤,我們的控制檯就是一片紅,這是JVM
有一個預設的異常處理機制,即將該異常的名稱、異常的資訊、異常出現的位置列印在了控制檯上,同時將程式停止執行。
但是,這樣只是我們看到報錯資訊罷了,而且如果是我們在專案開始上線執行時,出現報錯,使用者將看到一片亂碼,那這就會影響體驗感。
捕獲異常
既然我們要對異常做出反應,那我們就需要先捕捉到異常,就像JavaScript捕捉到一些動作一樣。
- 在Java中,一旦方法丟擲異常,系統自動根據該異常物件尋找合適異常處理器(Exception Handler)來處理該異常,把各種不同的異常進行分類,並提供了良好的介面。
- 在 Java 中,每個異常都是一個物件,它是
Throwable
類或其子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並可以對其進行處理。 - Java 的異常處理涉及了 5 個關鍵詞:
try
、catch
、finally
、throw
和throws
。
這裡有5個關鍵詞,那這些關鍵詞分別有啥用呢?
throw : 用於丟擲異常。
try : 用於監聽。
catch :用於捕獲異常。
finally :
finally
語句塊總是會被執行。它主要用於回收在try塊裡開啟的資源(如資料庫連線、網路連線和磁碟檔案)。注意:只有
finally
塊,執行完成之後,才會回來執行try
或者catch
塊中的return
或者throw
語句,如果finally
中使用了return
或者throw
等終止方法的語句,則就不會跳回執行,直接停止。
- throws: 用在方法簽名中,用於宣告該方法可能丟擲的異常。
而許多時候,我們的這些關鍵詞有常用的搭配。
try{
}catch () {
}finally {
}
而在處理的時候,我們會有如下流程。
示例
import java.util.Scanner;
public class TryDemo {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("輸入數字:");
int num = input.nextInt();
}
}
這裡,我輸入了一個a,控制檯直接紅紅火火。
我們試試異常捕捉。
package Box;
import java.util.Scanner;
public class TryDemo {
public static void main(String[] args) {
try {
Scanner input=new Scanner(System.in);
System.out.println("輸入數字:");
int num = input.nextInt();
}catch (Exception e) {
System.out.println(e);
}
}
}
此時,我們只輸出一句報錯資訊。
我們想讓他變得可以讓人接受一點或者輸出提示。
}catch (Exception e) {
System.out.println("程式出錯");
}
這樣就人性化許多了。
多重異常處理
這玩意和迴圈一樣,也可以多重巢狀。
當程式可能會產生多種型別的異常,針對可能出現的不同異常如果希望做不同的處理,那麼就可以使用多重catch
。 注意多重catch
塊中的異常型別不能一致,且捕獲父型別的catch
塊應該在子型別的後面,比如Exception
應該在最後面。
Finally
我們還有一個關鍵詞finally
,咋一看,好像沒啥用處啊?
不管報錯還是不報錯,我們的finally
內的語句都會被執行,那我們這個就肯定有用了。至於有什麼具體用處,到要用時,就會明白。
Return
當代碼中出現return
時,一定是finally
語句塊執行完成後才會去執行相應的return
程式碼,無論return
語句在什麼位置。
搜了張圖,這樣就更清晰了。
Throw和Throws
可以通過throws
宣告將要丟擲何種型別的異常,通過throw
將產生的異常丟擲
這裡看好,s結尾的時宣告,沒s的時產生。
Throw
定義的格式是這樣的:throw new 異常類名(引數)
先看看throw
的輸出。
Throws
定義是這樣的:修飾符 返回值型別 方法名(引數) throws 異常類名1,異常類名2…{ }
一般來說,Throws和Throw都是成對出現的。
我們知道,有時候,看程式碼時,他可能要你開始執行才開始丟擲錯誤。比如下面這段程式碼。
而我使用Throws
來宣告一個這段程式碼可能存在的錯誤時,如果恰好有錯誤,將會直接提示出現,不需要執行。
然後如果你這種情況下執行,他就提示如下。
也就是說,這裡的異常需要你用try
和catch
捕獲後,在使用throw
來丟擲異常。
擴充套件
try-with-resources結構
JDK7 之後,Java 新增的 try-with-resource 語法糖來開啟資源,並且可以在語句執行完畢後確保每個資源都被自動關閉 。
JDK7 之前所有被開啟的系統資源,比如流、檔案或者
Socket
連線等,都需要被開發者手動關閉,否則會造成資源洩露將。
語法如下。
try (resource declaration) {
// 使用的資源
} catch (ExceptionType e1) {
// 異常塊
}
自定義異常
在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。
- 所有異常都必須是
Throwable
的子類。 - 如果希望寫一個檢查性異常類,則需要繼承
Exception
類。 - 如果你想寫一個執行時異常類,那麼需要繼承
RuntimeException
類。
其他
在Java中定義了兩種型別的異常和錯誤。
-
JVM
異常:由JVM
丟擲的異常或錯誤。例如:NullPointerException
類,ArrayIndexOutOfBoundsException
類,ClassCastException
類。 - 程式級異常:由程式或者
API
程式丟擲的異常。例如IllegalArgumentException
類,IllegalStateException
類。