最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的異常處理機制try-catch詳解

 更新時間:2024年12月21日 11:47:22   作者:敲代碼敲到頭發(fā)茂密  
這篇文章主要介紹了Java中的異常處理機制try-catch詳解,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

一、異常概述

在使用計算機語言進行項目開發(fā)的過程中,即使程序員把代碼寫得盡善盡美,在系統(tǒng)的運行過程中仍然會遇到一些問題,因為很多問題不是靠代碼能夠避免的,比如:客戶輸入數(shù)據(jù)的格式問題,讀取文件是否存在 ,網絡是否始終保持通暢等等。
異常:指的是程序在執(zhí)行過程中,出現(xiàn)的非正常情況,如果不處理最終會導致JVM的非正常停止。

異常指的并不是語法錯誤和邏輯錯誤。語法錯了,編譯不通過,不會產生字節(jié)碼文件,根本不能運行。
代碼邏輯錯誤,只是沒有得到想要的結果,例如:求a與b的和,你寫成了a-b

1、異常的拋出機制

Java中是如何表示不同的異常情況,又是如何讓程序員得知,并處理異常的呢?
Java中把不同的異常用不同的類表示,一旦發(fā)生某種異常,就創(chuàng)建該異常類型的對象,并且拋出(throw)。然后程序員可以捕獲(catch)到這個異常對象,并處理;如果沒有捕獲(catch)這個異常對象,那么這個異常對象將會導致程序終止。
舉例:
運行下面的程序,程序會產生一個數(shù)組角標越界異常ArrayIndexOfBoundsException。我們通過圖解來解析下異常產生和拋出的過程。

2、如何對待異常

對于程序出現(xiàn)的異常,一般有兩種解決方法:一是遇到錯誤就終止程序的運行。另一種方法是程序員在編寫程序時,就充分考慮到各種可能發(fā)生的異常和錯誤,極力預防和避免。實在無法避免的,要編寫相應的代碼進行異常的檢測、以及 異常的處理,保證代碼的 健壯性。

3、異常的體系結構

3.1、Throwable

java.lang.Throwable:異常體系的父類
Throwable中的常用方法:

  • public void printStackTrace():打印異常的詳細信息。

包含了異常的類型、異常的原因、異常出現(xiàn)的位置、在開發(fā)和調試階段都得使用printStackTrace。

  • public String getMessage():獲取發(fā)生異常的原因。

3.2、Error和Exception

Throwable可分為兩類:Error和Exception。分別對應著java.lang.Errorjava.lang.Exception 兩個類。
Error:Java虛擬機無法解決的嚴重問題。如:JVM系統(tǒng)內部錯誤、資源耗盡等嚴重情況。一般不編寫針對性的代碼進行處理。

  • 例如:StackOverflowError(棧內存溢出)和OutOfMemoryError(堆內存溢出,簡稱OOM)。

Exception: 其它因編程錯誤或偶然的外在因素導致的一般性問題,需要使用針對性的代碼進行處理,使程序繼續(xù)運行。否則一旦發(fā)生異常,程序也會掛掉。例如:

  • 空指針訪問
  • 試圖讀取不存在的文件
  • 網絡連接中斷
  • 數(shù)組角標越界

3.3、編譯時異常和運行時異常

編譯時期異常(即checked異常、受檢異常):在代碼編譯階段,編譯器就能明確 警示 當前代碼 可能發(fā)生(不是一定發(fā)生) xx異常,并 明確督促 程序員提前編寫處理它的代碼。如果程序員 沒有編寫 對應的異常處理代碼,則編譯器就會直接判定編譯失敗,從而不能生成字節(jié)碼文件。通常,這類異常的發(fā)生不是由程序員的代碼引起的,或者不是靠加簡單判斷就可以避免的,例如:FileNotFoundException(文件找不到異常)。
運行時期異常(即runtime異常、unchecked異常、非受檢異常):在代碼編譯階段,編譯器完全不做任何檢查,無論該異常是否會發(fā)生,編譯器都不給出任何提示。只有等代碼運行起來并確實發(fā)生了xx異常,它才能被發(fā)現(xiàn)。通常,這類異常是由程序員的代碼編寫不當引起的,只要稍加判斷,或者細心檢查就可以避免。

  • java.lang.RuntimeException類及它的子類都是運行時異常。比如:ArrayIndexOutOfBoundsException數(shù)組下標越界異常,ClassCastException類型轉換異常。

運行時異常:
ArrayIndexOutOfBoundsException:角標越界
NullPointException:空指針異常
ClassCastException:類型轉換異常
NumberFormatException:無法轉化異常
InputMismatchException:輸入類型異常
ArithmeticException:算術異常

編譯型異常
ClassNotFoundException
FileNotFoundException
IOException

二、異常的處理方式一 try-catch的使用

在編寫程序時,經常要在可能出現(xiàn)錯誤的地方加上檢測的代碼,如進行x/y運算時,要檢測分母為0,數(shù)據(jù)為空,輸入的不是數(shù)據(jù)而是字符 等。過多的if-else分支會導致程序的代碼加長、臃腫 ,可讀性差,程序員需要花很大的精力“ 堵漏洞”。因此采用異常處理機制。

Java異常處理
Java采用的異常處理機制,是將異常處理的程序代碼集中在一起 ,與正常的程序代碼分開,使得程序簡潔、優(yōu)雅,并易于維護。

Java異常處理的方式:
方式一:try-catch-finally
方式二:throws+異常類型

1、過程1:拋

程序在執(zhí)行的過程當中,一旦出現(xiàn)異常,就會在出現(xiàn)異常的代碼處,生成對應的異常類對象,并將此對象拋出。
一旦拋出此程序不執(zhí)行其后面的代碼。

2、過程2:抓

針對過程1中拋出的對象,進行捕獲處理。此捕獲處理的過程,就成為抓
一旦將異常進行處理,代碼就可以急促執(zhí)行。

try{
	...//可能出現(xiàn)的異常代碼
}catch(異常類型1 e){
	...//當產生異常類型1 異常時的處置措施
}catch(異常類型2 e){
	...//當產生異常類型2 異常時的處置措施
}finally{
	...//無論是否發(fā)生異常,都無條件執(zhí)行的語句
}
import java.util.InputMismatchException;
import java.util.Scanner;
/**
 * package:PACKAGE_NAME
 *
 * @Author jimmy-yan
 * @Create 2024/11/18 17:14
 */
public class ExceptionTest {
    public static void main(String[] args) {
        ExceptionTest e = new ExceptionTest();
        e.test();
    }
    public void test() {
        try {
            Scanner scanner = new Scanner(System.in);
            int num = scanner.nextInt();
            System.out.println(num);
        } catch (InputMismatchException e) {
            System.out.println("出現(xiàn)了InputMismatchException異常");
        } catch (RuntimeException e) {
            System.out.println("出現(xiàn)了RuntimeException異常");
        }
        System.out.println("異常處理結束,代碼繼續(xù)執(zhí)行");
    }
}

3、使用細節(jié)

1、將可能出現(xiàn)異常的代碼聲明在try語句中。一旦代碼出現(xiàn)異常,就會自動生成一個對應異常類的對象。并將此對象拋出。
2、針對于try中拋出的異常類的對象,使用之后的catch語句進行匹配,一旦匹配上,就進入catch語句塊進行處理。
3、一旦處理結束,代碼就可以繼續(xù)向下執(zhí)行。
4、如果聲明了多個catch結構,不同的異常類型在子父關系的情況下,誰聲明在上面,誰聲明在下面都可以。如果多個異常類型滿足子父類的關系,必須將子類聲明在父類結構的上面。否則報錯。
5、catch中異常處理的方式:
a、自己編寫輸出的語句;
b、printStackTrace:打印異常的詳細信息;(推薦)
6、try中聲明的變量,出了try結構之后,就不可以進行調用了。

4、運行時異常案例

import java.util.InputMismatchException;
import java.util.Scanner;
/**
 * package:PACKAGE_NAME
 *
 * @Author jimmy-yan
 * @Create 2024/11/18 17:14
 */
public class ExceptionTest {
    public static void main(String[] args) {
        ExceptionTest e = new ExceptionTest();
        e.test1();
    }
    public void test1() {
        try {
            String str = "123";
            str = "abc";
            int i = Integer.parseInt(str);
            System.out.println(i);
        }catch (NumberFormatException e){
            e.printStackTrace();
        }
        System.out.println("程序執(zhí)行結束");
    }
}

5、編譯型異常案例

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
 * package:PACKAGE_NAME
 *
 * @Author jimmy-yan
 * @Create 2024/11/18 17:14
 */
public class ExceptionTest {
    public static void main(String[] args) {
        ExceptionTest e = new ExceptionTest();
//        e.test();
//        e.test1();
        e.test2();
    }
    public void test() {
        try {
            Scanner scanner = new Scanner(System.in);
            int num = scanner.nextInt();
            System.out.println(num);
        } catch (InputMismatchException e) {
            System.out.println("出現(xiàn)了InputMismatchException異常");
        } catch (RuntimeException e) {
            System.out.println("出現(xiàn)了RuntimeException異常");
        }
        System.out.println("異常處理結束,代碼繼續(xù)執(zhí)行");
    }
    public void test1() {
        try {
            String str = "123";
            str = "abc";
            int i = Integer.parseInt(str);
            System.out.println(i);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        System.out.println("程序執(zhí)行結束");
    }
    public void test2() {
        try {
            File file = new File("D:\\hello.txt");
            FileInputStream fis = new FileInputStream(file);  //可能報FileFonudException
            int data = fis.read(); //可能報IOException
            while (data != -1) {
                System.out.println((char) data);
                data = fis.read(); //可能報IOException
            }
            fis.close();  //可能報IOException
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6、開發(fā)體會

對于運行時異常:

開發(fā)中,通常就不進行顯示的處理了,一旦在程序執(zhí)行中,出現(xiàn)了運行時異常,那么就根據(jù)異常的提示信息修改代碼即可。

對于編譯型異常:

一定要處理,否則代碼不能執(zhí)行通過

到此這篇關于Java-異常處理機制-try-catch的文章就介紹到這了,更多相關Java異常處理機制try-catch內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java多線程編程中使用Condition類操作鎖的方法詳解

    Java多線程編程中使用Condition類操作鎖的方法詳解

    Condition是java.util.concurrent.locks包下的類,提供了對線程鎖的更精細的控制方法,下面我們就來看一下Java多線程編程中使用Condition類操作鎖的方法詳解
    2016-07-07
  • Java詳細分析LCN框架分布式事務

    Java詳細分析LCN框架分布式事務

    這篇文章主要介紹了Java LCN框架分布式事務,分布式事務是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點之上
    2022-07-07
  • JAVA三種攔截方式詳解(原生過濾器Filter、springMVC攔截器、aop切面)

    JAVA三種攔截方式詳解(原生過濾器Filter、springMVC攔截器、aop切面)

    在Java開發(fā)中方法攔截是一種常見的技術,可以用于在方法執(zhí)行前后添加額外的邏輯或修改方法的行為,這篇文章主要給大家介紹了關于JAVA三種攔截方式的相關資料,文中介紹的方式分別是原生過濾器Filter、springMVC攔截器、aop切面,需要的朋友可以參考下
    2024-05-05
  • Java集合源碼ArrayList的可視化操作過程示例詳解

    Java集合源碼ArrayList的可視化操作過程示例詳解

    這篇文章主要介紹了Java集合源碼ArrayList的可視化操作過程示例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-06-06
  • Java基于IO流讀取文件的方法

    Java基于IO流讀取文件的方法

    這篇文章主要介紹了Java基于IO流讀取文件的方法,涉及Java文件流操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Java實現(xiàn)紅黑樹(平衡二叉樹)的詳細過程

    Java實現(xiàn)紅黑樹(平衡二叉樹)的詳細過程

    紅黑樹接近平衡的二叉樹,插入,刪除函數(shù)跟平衡二叉樹一樣,只是平衡函數(shù)不同,下面這篇文章主要給大家介紹了關于Java實現(xiàn)紅黑樹(平衡二叉樹)的相關資料,需要的朋友可以參考下
    2021-10-10
  • java通過PDF模板填寫PDF表單

    java通過PDF模板填寫PDF表單

    這篇文章主要為大家詳細介紹了java通過PDF模板填寫PDF表單,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Spring Security登陸流程講解

    Spring Security登陸流程講解

    本文主要介紹了Spring Security登陸流程講解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 詳解Spring MVC 集成EHCache緩存

    詳解Spring MVC 集成EHCache緩存

    本篇文章主要介紹了詳解Spring MVC 集成EHCache緩存,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • java中l(wèi)ambda(函數(shù)式編程)一行解決foreach循環(huán)問題

    java中l(wèi)ambda(函數(shù)式編程)一行解決foreach循環(huán)問題

    這篇文章主要介紹了java中l(wèi)ambda(函數(shù)式編程)一行解決foreach循環(huán)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

东乡| 凤城市| 灯塔市| 杂多县| 丹阳市| 宜良县| 叶城县| 铁岭县| 大庆市| 南阳市| 阳东县| 九龙县| 八宿县| 定兴县| 正镶白旗| 舟山市| 万盛区| 县级市| 普兰店市| 宁安市| 久治县| 黑水县| 津市市| 南通市| 扎兰屯市| 香港 | 甘南县| 监利县| 梧州市| 江山市| 馆陶县| 麻江县| 万载县| 漠河县| 湘乡市| 门源| 德钦县| 金山区| 江孜县| 万全县| 建水县|