Java catch與throw同時使用的操作
一、應用背景
在實際應用中,處理異常往往需要更加復雜的處理——當一個異常出現(xiàn)時,單靠某個方法無法完全處理該異常,必須由幾個方法協(xié)作才能完全處理該異常,也就是說,在異常出現(xiàn)的當前方法中,程序只能對異常進行部分處理,還有些處理需要在方法的調用者中才能完成,所以應該再次拋出異常,讓該方法的調用者也能捕獲到異常。
為了實現(xiàn)這種通過多個方法協(xié)作處理同一異常的情形,可以catch塊中結合throw語句來完成。
二、應用舉例
1 代碼示例
AuctionTest.java
public class AuctionTest
{
private double initPrice = 30.0;
// 因為該方法中顯式拋出了AuctionException異常,
// 所以此處需要聲明拋出AuctionException異常
public void bid(String bidPrice)
throws AuctionException
{
double d = 0.0;
try
{
d = Double.parseDouble(bidPrice);
}
catch (Exception e)
{
// 此處完成本方法中可以對異常執(zhí)行的修復處理,
// 此處僅僅是在控制臺打印異常跟蹤棧信息。
e.printStackTrace();
// 再次拋出自定義異常
throw new AuctionException("競拍價必須是數(shù)值,"
+ "不能包含其他字符!");
}
if (initPrice > d)
{
throw new AuctionException("競拍價比起拍價低,"
+ "不允許競拍!");
}
initPrice = d;
}
public static void main(String[] args)
{
AuctionTest at = new AuctionTest();
try
{
at.bid("df");
}
catch (AuctionException ae)
{
// 再次捕捉到bid方法中的異常。并對該異常進行處理
System.err.println(ae.getMessage());
}
}
}
AuctionException.java
public class AuctionException extends Exception
{
// 無參數(shù)的構造器
public AuctionException(){} //①
// 帶一個字符串參數(shù)的構造器
public AuctionException(String msg) //②
{
super(msg);
}
}
2 運行結果
java.lang.NumberFormatException: For input string: "df" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224) at java.lang.Double.parseDouble(Double.java:510) at AuctionTest.bid(AuctionTest.java:16) at AuctionTest.main(AuctionTest.java:39)
競拍價必須是數(shù)值,不能包含其他字符!
3 結果說明
上面程序bid對應catch塊捕獲到異常后,系統(tǒng)打印了該異常的跟蹤棧信息,接著拋出一個AuctionException異常,通知該方法調用者再次處理AuctionException異常。
所有程序中的main方法,也就是bid方法調用者再次捕獲AuctionException異常并將該異常詳細描述信息輸出到標準錯誤輸出。
補充:Java try-catch、throw和throws的幾點想法
以前寫代碼,很少用到異常,后來發(fā)現(xiàn)這種習慣是錯的。異常也是一種信息,并不是錯誤。
1:先寫個簡單的類:
package com.exception.demo;
public class Main {
public static void main(String[] args) {
Main main = new Main();
}
public void methodTry() {
}
public void methodThrow() {
}
}
初始環(huán)境就是這么簡答。
2:下面給方法methodTry加上方法主體:
public static void main(String[] args) {
Main main = new Main();
main.methodTry();
}
public void methodTry() {
int a=10;
int b=0;
int c=a/b;
}
剛開始學代碼的時候都會寫這個方法,會拋出一個異常:

控制臺很清楚的告訴我們,被除數(shù)不能為0.但是如果我們想自己獲取這個異常,然后做些操作呢?比如說 如果這個方法體有問題,我就做一個輸出。
public void methodTry() {
try {
int a=10;
int b=0;
int c=a/b;
System.out.println(c);
} catch (Exception e) {
System.out.println("這個方法體有問題:"+e.getMessage());
}
}
這個時候就用到了try-catch,手動的捕獲這個異常,然后進行我們需要的操作。畢竟異常分很多種,并不是所有的異常都是我們不需要的。
比如說對用戶登錄來說,登錄成功 登錄失敗兩種結果,登錄失敗又分為重復登錄,賬號密碼不匹配等。
我們可以把這些失敗全都寫成Exception。當成功的時候就直接返回,失敗的時候拋出異常,這個可比我們寫好多返回值簡單多了。
接著說try-catch

我們手動的捕獲了這個異常。上面的代碼告訴我們,當try-catch塊中有異常時,異常后面的代碼是不會執(zhí)行的。try-catch還有什么好處?回滾。
3:throw
public static void main(String[] args) {
Main main = new Main();
main.methodThrow();
}
public void methodThrow() {
throw new Exception("這里有異常");
}
其實當我簡單的拋出個異常的時候,throw new Exception()這里會報錯,現(xiàn)在看一個報錯信息:

顯示讓我們選擇是throws 還是try-catch。
我們寫好的throw是什么意思呢? 其實跟a/0是一個意思,都是拋出一個異常,只不過一個是jdk已經(jīng)定義好的異常,被除數(shù)不能為0.一個是我們手動拋出的異常。
先用try-catch試試看
public void methodThrow() {
try {
throw new Exception("這里有異常");
} catch (Exception e) {
System.out.println("MethodThrow:"+e.getMessage());
}
}

重點在于手動拋出異常后,我們要在catch中進行處理,在catch中寫我們的部門邏輯代碼。
4:throws
剛才我們選擇的是try-catch,現(xiàn)在選擇throws
public static void main(String[] args) throws Exception {
Main main = new Main();
main.methodThrow();
}
public void methodThrow() throws Exception {
throw new Exception("這里有異常");
}
方法methodThrow throws Exception之后,他的父類就面臨著兩種情況,要么try-catch 要么throws這個異常。這種情況跟methodThrow中手動拋出異常遇到的問題是一樣的。
看來可以這么理解:
throw是手動拋出異常,跟 被除數(shù)不能為0 數(shù)組下標越界等異常一樣,都是異常。
try-catch是在catch中手動捕獲異常,然后進行一些操作。比如說輸出異常信息,打印錯誤日志等。
throws是往上級拋出異常,我的方法methodThrow有異常,但是在這個方法中我不進行處理了,讓上級進行處理吧。然后就跑到main函數(shù)那去了。
對main函數(shù)來說,可以throws讓系統(tǒng)進行處理,也可以自己處理這個異常啊。
main.methodThrow()和a/0 、throw new Execption()沒什么區(qū)別,都是有異常。
其實可以整體的寫:
public static void main(String[] args){
Main main = new Main();
try {
main.methodThrow();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void methodThrow() throws Exception {
throw new Exception("這里有異常");
}
方法中的異常,到main函數(shù)中再進行處理。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
springboot oauth2實現(xiàn)單點登錄實例
我們見過的很多網(wǎng)站,容許使用第三方賬號登錄,oauth2是用來做三方登錄的,本文就詳細的介紹springboot oauth2實現(xiàn)單點登錄實例,具有一定的參考價值,感興趣的可以了解一下2022-01-01
Java使用Spring發(fā)送郵件的實現(xiàn)代碼
本篇文章主要介紹了使用Spring發(fā)送郵件的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
@MapperScan和@ComponentScan一塊使用導致沖突的解決
這篇文章主要介紹了@MapperScan和@ComponentScan一塊使用導致沖突的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
解讀@SpringBootApplication注解有什么用
@SpringBootApplication是SpringBoot的核心注解,主要包含@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三個注解,這些注解共同簡化了Spring應用的配置工作,并使得通過主程序類就可以啟動SpringBoot應用2024-09-09
Spring實現(xiàn)源碼下載編譯及導入IDEA過程圖解
這篇文章主要介紹了Spring實現(xiàn)源碼下載編譯及導入IDEA,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07

