欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java catch與throw同時(shí)使用的操作

 更新時(shí)間:2021年02月24日 14:39:39   作者:chengqiuming  
這篇文章主要介紹了Java catch與throw同時(shí)使用的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

一、應(yīng)用背景

在實(shí)際應(yīng)用中,處理異常往往需要更加復(fù)雜的處理——當(dāng)一個(gè)異常出現(xiàn)時(shí),單靠某個(gè)方法無法完全處理該異常,必須由幾個(gè)方法協(xié)作才能完全處理該異常,也就是說,在異常出現(xiàn)的當(dāng)前方法中,程序只能對(duì)異常進(jìn)行部分處理,還有些處理需要在方法的調(diào)用者中才能完成,所以應(yīng)該再次拋出異常,讓該方法的調(diào)用者也能捕獲到異常。

為了實(shí)現(xiàn)這種通過多個(gè)方法協(xié)作處理同一異常的情形,可以catch塊中結(jié)合throw語句來完成。

二、應(yīng)用舉例

1 代碼示例

AuctionTest.java

public class AuctionTest
{
	private double initPrice = 30.0;
	// 因?yàn)樵摲椒ㄖ酗@式拋出了AuctionException異常,
	// 所以此處需要聲明拋出AuctionException異常
	public void bid(String bidPrice)
		throws AuctionException
	{
		double d = 0.0;
		try
		{
			d = Double.parseDouble(bidPrice);
		}
		catch (Exception e)
		{
			// 此處完成本方法中可以對(duì)異常執(zhí)行的修復(fù)處理,
			// 此處僅僅是在控制臺(tái)打印異常跟蹤棧信息。
			e.printStackTrace();
			// 再次拋出自定義異常
			throw new AuctionException("競(jìng)拍價(jià)必須是數(shù)值,"
				+ "不能包含其他字符!");
		}
		if (initPrice > d)
		{
			throw new AuctionException("競(jìng)拍價(jià)比起拍價(jià)低,"
				+ "不允許競(jìng)拍!");
		}
		initPrice = d;
	}
	public static void main(String[] args)
	{
		AuctionTest at = new AuctionTest();
		try
		{
			at.bid("df");
		}
		catch (AuctionException ae)
		{
			// 再次捕捉到bid方法中的異常。并對(duì)該異常進(jìn)行處理
			System.err.println(ae.getMessage());
		}
	}
}

AuctionException.java

public class AuctionException extends Exception
{
 // 無參數(shù)的構(gòu)造器
 public AuctionException(){}    //①
 // 帶一個(gè)字符串參數(shù)的構(gòu)造器
 public AuctionException(String msg)  //②
 {
 super(msg);
 }
}

2 運(yùn)行結(jié)果

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)

競(jìng)拍價(jià)必須是數(shù)值,不能包含其他字符!

3 結(jié)果說明

上面程序bid對(duì)應(yīng)catch塊捕獲到異常后,系統(tǒng)打印了該異常的跟蹤棧信息,接著拋出一個(gè)AuctionException異常,通知該方法調(diào)用者再次處理AuctionException異常。

所有程序中的main方法,也就是bid方法調(diào)用者再次捕獲AuctionException異常并將該異常詳細(xì)描述信息輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出。

補(bǔ)充:Java try-catch、throw和throws的幾點(diǎn)想法

以前寫代碼,很少用到異常,后來發(fā)現(xiàn)這種習(xí)慣是錯(cuò)的。異常也是一種信息,并不是錯(cuò)誤。

1:先寫個(gè)簡(jiǎn)單的類:

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)境就是這么簡(jiǎ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;
  }

剛開始學(xué)代碼的時(shí)候都會(huì)寫這個(gè)方法,會(huì)拋出一個(gè)異常:

控制臺(tái)很清楚的告訴我們,被除數(shù)不能為0.但是如果我們想自己獲取這個(gè)異常,然后做些操作呢?比如說 如果這個(gè)方法體有問題,我就做一個(gè)輸出。

  public void methodTry() {
    try {
      int a=10;
      int b=0;
      int c=a/b;
      System.out.println(c);
    } catch (Exception e) {
      System.out.println("這個(gè)方法體有問題:"+e.getMessage());
    }
    
  }

這個(gè)時(shí)候就用到了try-catch,手動(dòng)的捕獲這個(gè)異常,然后進(jìn)行我們需要的操作。畢竟異常分很多種,并不是所有的異常都是我們不需要的。

比如說對(duì)用戶登錄來說,登錄成功 登錄失敗兩種結(jié)果,登錄失敗又分為重復(fù)登錄,賬號(hào)密碼不匹配等。

我們可以把這些失敗全都寫成Exception。當(dāng)成功的時(shí)候就直接返回,失敗的時(shí)候拋出異常,這個(gè)可比我們寫好多返回值簡(jiǎn)單多了。

接著說try-catch

我們手動(dòng)的捕獲了這個(gè)異常。上面的代碼告訴我們,當(dāng)try-catch塊中有異常時(shí),異常后面的代碼是不會(huì)執(zhí)行的。try-catch還有什么好處?回滾。

3:throw

  public static void main(String[] args) {
    Main main = new Main();
    main.methodThrow();
  }
  public void methodThrow() {
    throw new Exception("這里有異常");
  }

其實(shí)當(dāng)我簡(jiǎn)單的拋出個(gè)異常的時(shí)候,throw new Exception()這里會(huì)報(bào)錯(cuò),現(xiàn)在看一個(gè)報(bào)錯(cuò)信息:

顯示讓我們選擇是throws 還是try-catch。

我們寫好的throw是什么意思呢? 其實(shí)跟a/0是一個(gè)意思,都是拋出一個(gè)異常,只不過一個(gè)是jdk已經(jīng)定義好的異常,被除數(shù)不能為0.一個(gè)是我們手動(dòng)拋出的異常。

先用try-catch試試看

  public void methodThrow() {
    try {
      throw new Exception("這里有異常");
    } catch (Exception e) {
      System.out.println("MethodThrow:"+e.getMessage());
    }
  }

重點(diǎn)在于手動(dòng)拋出異常后,我們要在catch中進(jìn)行處理,在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這個(gè)異常。這種情況跟methodThrow中手動(dòng)拋出異常遇到的問題是一樣的。

看來可以這么理解:

throw是手動(dòng)拋出異常,跟 被除數(shù)不能為0 數(shù)組下標(biāo)越界等異常一樣,都是異常。

try-catch是在catch中手動(dòng)捕獲異常,然后進(jìn)行一些操作。比如說輸出異常信息,打印錯(cuò)誤日志等。

throws是往上級(jí)拋出異常,我的方法methodThrow有異常,但是在這個(gè)方法中我不進(jìn)行處理了,讓上級(jí)進(jìn)行處理吧。然后就跑到main函數(shù)那去了。

對(duì)main函數(shù)來說,可以throws讓系統(tǒng)進(jìn)行處理,也可以自己處理這個(gè)異常啊。

main.methodThrow()和a/0 、throw new Execption()沒什么區(qū)別,都是有異常。

其實(shí)可以整體的寫:

  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ìn)行處理。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Java使用反射獲取字段屬性

    Java使用反射獲取字段屬性

    這篇文章主要為大家詳細(xì)介紹了Java如何利用反射實(shí)現(xiàn)獲取字段屬性值,文中的示例代碼講解詳細(xì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2023-06-06
  • Mybatis多個(gè)字段模糊匹配同一個(gè)值的案例

    Mybatis多個(gè)字段模糊匹配同一個(gè)值的案例

    這篇文章主要介紹了Mybatis多個(gè)字段模糊匹配同一個(gè)值的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java格式化日期和時(shí)間三種方法

    Java格式化日期和時(shí)間三種方法

    這篇文章主要給大家介紹了關(guān)于Java格式化日期和時(shí)間三種方法的相關(guān)資料,最近遇到很多在Java里獲取當(dāng)前時(shí)間的問題,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例

    springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例

    我們見過的很多網(wǎng)站,容許使用第三方賬號(hào)登錄,oauth2是用來做三方登錄的,本文就詳細(xì)的介紹springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • Gateway如何實(shí)現(xiàn)全局跨域

    Gateway如何實(shí)現(xiàn)全局跨域

    這篇文章主要介紹了Gateway如何實(shí)現(xiàn)全局跨域問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java使用Spring發(fā)送郵件的實(shí)現(xiàn)代碼

    Java使用Spring發(fā)送郵件的實(shí)現(xiàn)代碼

    本篇文章主要介紹了使用Spring發(fā)送郵件的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • @MapperScan和@ComponentScan一塊使用導(dǎo)致沖突的解決

    @MapperScan和@ComponentScan一塊使用導(dǎo)致沖突的解決

    這篇文章主要介紹了@MapperScan和@ComponentScan一塊使用導(dǎo)致沖突的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java 獲取內(nèi)存使用率的流程實(shí)例詳解

    java 獲取內(nèi)存使用率的流程實(shí)例詳解

    這篇文章主要為大家介紹了java 獲取內(nèi)存使用率的流程實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 解讀@SpringBootApplication注解有什么用

    解讀@SpringBootApplication注解有什么用

    @SpringBootApplication是SpringBoot的核心注解,主要包含@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三個(gè)注解,這些注解共同簡(jiǎn)化了Spring應(yīng)用的配置工作,并使得通過主程序類就可以啟動(dòng)SpringBoot應(yīng)用
    2024-09-09
  • Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA過程圖解

    Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA過程圖解

    這篇文章主要介紹了Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論