1. 程式人生 > >Java異常處理-2-JVM異常處理方式和try catch處理異常

Java異常處理-2-JVM異常處理方式和try catch處理異常

       前面我們大概瞭解了什麼是異常和為什麼要處理異常。這篇我們先通過了解JVM是如何預設處理異常,然後我們是如何主動去捕獲和處理異常的。

1.JVM處理異常的方式

      在Java中,Java虛擬機器(JVM)是如何處理異常的呢?,在執行Main函式的時候,如果執行過程中遇到異常問題,有兩種處理方式:1)自己將該問題處理,然後繼續執行 2)自己沒有針對該問題處理方式,只有交給呼叫Main的JVM來處理。而JVM有一個預設的異常處理機制,遇到異常,丟擲異常,和列印異常資訊,同時將程式停止執行。

      舉例,算數執行,如果除數為空就報異常的,JVM就自動丟擲異常,停止執行執行異常出現程式碼行後面的程式碼。

package exception;

public class Demo1_Exception {

	public static void main(String[] args) {
		
		int x = div(10,0);
		System.out.println(x);
	}
	
	public static int div(int a, int b) {
		return a / b;
	}

}

執行結果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at exception.Demo1_Exception.div(Demo1_Exception.java:12)
	at exception.Demo1_Exception.main(Demo1_Exception.java:7)

      這個異常是違背了算數法則而設計的一個異常類物件。這個JVM執行大概是這樣去處理問題的:執行到第7行程式碼,JVM發現遇到了它處理不了的情況。原因是在第12行程式碼出現了除數為0的異常,呼叫了div()方法,得到的返回物件不是一個int型別,而是一個new ArithmeticException() 這樣的一個異常物件,把一個異常物件賦值給x,x又是int型別,所以出了錯誤,中斷了程式。

2.try catch主動去處理異常

      既然JVM預設是丟擲異常,中斷程式執行,所以,程式設計師在寫程式碼的時候都應該小心,應該主動去捕獲並處理異常。在Java中,我們通過try ... catch語句來主動處理異常。有時候,try catch還會和finally一起出現,所以try ... catch語句有多種寫法。我們先來看看這三個關鍵字的含義。

1)try:是用來檢測異常

2)catch:是用來捕獲異常

3)finally:最終的意思,一般用來釋放資源,例如關閉檔案和斷開資料庫連線等。

2.1 try catch舉例

package exception;

public class Demo1_Exception {

	public static void main(String[] args) {
	
		try{
			int x = div(10,0);
			System.out.println(x);
			
		} catch(ArithmeticException a) {
			System.out.println("除數為零!");
		}
	}
	
	public static int div(int a, int b) {
		return a / b;
	}

}

      這個時候執行程式碼會列印:除數為零!,而不會丟擲異常,這個時候程式就沒有中斷,列印了這個錯誤,還可以繼續執行下去。

2.2 多個try catch 舉例

      大部分時候,我們都是使用多個catch的情況,下面舉例一下,同時捕獲邊界越界和除數為零的異常。

package exception;

public class Demo1_Exception {

	public static void main(String[] args) {
	
		try{
			
			int[] arr = {11,22,33};
			int x = div(10,0);
			System.out.println(x);
			System.out.println(arr[5]);
			
		} catch(ArithmeticException a) {
			System.out.println("除數為零!");
		} catch(ArrayIndexOutOfBoundsException a) {
			System.out.println("陣列索引越界了");
		} 
		
	}
	
	public static int div(int a, int b) {
		return a / b;
	}

}

      上面程式碼,寫了兩個catch程式碼塊。第一個是捕獲除數為零異常,第二個是捕獲陣列索引越界異常。執行程式碼,輸出除數為零的。英文try裡面最新監測到了除數為零的異常,裡面就跳轉到了對應捕獲除數為零的程式碼塊,這個時候就跳出了try catch整體範圍,所以沒有繼續列印陣列索引越界了的訊息。你可以登出10 11行程式碼執行就可以列印陣列索引越界了的訊息。

       在實際的寫程式碼中,我們一般也就和上面一樣寫幾個可能出現的異常,然後後面新增一個Exception的捕獲。Exception範圍包括了所以的異常。所以,小範圍的異常捕獲需要寫在Exception捕獲語句前面。

package exception;

public class Demo1_Exception {

	public static void main(String[] args) {
	
		try{
			
			int[] arr = {11,22,33};
			int x = div(10,0);
			System.out.println(x);
			System.out.println(arr[5]);
			
		} catch(ArithmeticException a) {
			System.out.println("除數為零!");
		} catch(ArrayIndexOutOfBoundsException a) {
			System.out.println("陣列索引越界了");
		} catch(Exception e) {
			System.out.println("出錯了");
		}
		
	}
	
	public static int div(int a, int b) {
		return a / b;
	}

}

      上面第三個catch語句中捕獲Exception異常的好處就是,能自動捕獲所有的異常。即使你不寫前面的除數為零和陣列索引越界異常,只寫一個Exception也能捕獲到。這裡就是執行了Exception e = new ArithmeticException(); 多型中的父類應用指向了子類物件。上面提到了finally關鍵字,我們後面來學習,finally關鍵字有特定的功能。



相關推薦

Java異常處理-2-JVM異常處理方式try catch處理異常

       前面我們大概瞭解了什麼是異常和為什麼要處理異常。這篇我們先通過了解JVM是如何預設處理異常,然後我們是如何主動去捕獲和處理異常的。1.JVM處理異常的方式      在Java中,Java

java 異常處理方式之一 trycatch——finally

java 異常處理方式之一: try—catch——finally 1. 如何處理Exception的異常 2. 注: 3.dome 1. 如何處理Exception的異常 Java提供的是異常處理的抓拋模型為

java中的try-catch-finnal異常處理(學習筆記)

不堪 java sha highlight 抽取 最終 throwable 關鍵字 學習筆記 一、異常概述 異常:Exception,是在運行發生的不正常情況。 原始異常處理: if(條件) {   處理辦法1  處理辦法2  處理辦法3} if(條件) {   處理辦法

java 異常處理機制,throws與throw,try-catch-finally

java 異常處理機制 1.Java異常處理 2.try-catch-finally的程式流程圖 3.關鍵解讀 4.demo 5.不捕獲異常時的情況 在編寫程式時,經常要在可能出現錯誤的地方

JAVA : try catch resource異常處理

目錄: try-with-resources jdk1.7後增加了try-with-resources,他是一個宣告一個或多個資源的try語句。一個資源作為一個物件,必須在程式結束之後關閉。try-with-resources語句確保在語句的最後每

js try catch處理異常

異常:很多情況都會導致異常 當程式出現了異常,會導致異常之後的程式碼無法執行(異常之前的程式碼是正常執行的) 進行異常處理,語法結構: 程式碼1 try{     可能會出現異常的程式碼2 }catch(e){     假如出現了異

C++中用try - catch處理異常的情況

正常程式碼放在try塊,catch中捕獲try塊用throw關鍵字丟擲的異常。 例如: try { //將可能出現異常的情況放到try塊 if ( a >12 ) throw 12; // a >12時丟擲,若成立下面程式碼就不會再執行了 if ( a < 10 )

C++異常處理解析: 異常的引發(throw), 捕獲(try catch)、異常安全

前言: C++的異常處理機制是用於將執行時錯誤檢測和錯誤處理功能分離的一 種機制(符合高內聚低耦合的軟體工程設計要求),  這裡主要總結一下C++異常處理的基礎知識, 包括基本的如何引發異常(使用throw)和捕獲異常(try catch)相關使用注意點, 以及C++標準庫提供的一套標準異常類和這

建立Java多執行緒的兩種方式執行緒異常

一.使用多執行緒的兩種方法  使用多執行緒的兩種方法有:繼承Thread類和實現runable介面。 二.繼承Thread類 來看一下thread類的原始碼:  class Thread implements Runnable { 首先可以看出thread類也是實現Runable介面的run方法如下:

try catch處理異常處理

<?php/*try{}catch{}try catch是一體,中間不能有任何程式碼;1.try中如果沒有異常丟擲,就執行完try中的程式碼跳過catch,直接執行之後的程式碼;2.Except

PHP中try catch處理多個異常捕獲

<?php//建立四個exception的子類,每個子類中分別有一個可以解決異常問題的方法class wcexception extends exception{function pro(){e

try-catch-finally異常處理(一)

java異常處理的方式有兩種 1.捕捉異常 2.轉移異常 這裡先說捕捉異常(對於一個系統而言,異常處理是非常關鍵的,處理得好能夠避免和減少系統bug,同時也能夠非常好的定位問題來源) 捕捉異常都是通過try-catch-finally結構處理,一般有兩種格式 如下所示:

C#--try catch異常處理

異常處理:try catch;throw:專門扔異常。 程式碼放到try中,程式碼執行時會執行try中語句。如果沒有異常,這些語句將執行下去,直到執行結束;如果一旦出現異常則跳出try,去執行catc

java常用的2中加密密碼方式MD5Encrypt

Encrypt方式加密 package com.cc.common.util;import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.Mes

PHP 使用try catch,捕獲異常

get type 設置 html 異常信息 utf-8 tex http mes <?php header(‘Content-type:text/html;charset=utf-8‘); $a = 1; $b = 2; try {

spring 聲明式事務中try catch捕獲異常

調用 color exception 代碼 狀態 新的 for 自定義 這樣的 原文:http://heroliuxun.iteye.com/blog/848122 今天遇到了一個這個問題 最近遇到這樣的問題,使用spring時,在業務層需要捕獲異常(特殊需要),當前一般

ThinkPHP 3.2.3中訪問方式URL生成

ThinkPHP 3.2.3中簡單訪問方式: 你的域名/模組(Home)/控制器名(admin)/方法名(Adminregister) http://test.tp3.cn/Home/admin/A

JavaScript try catch 處理語句

以前很少用異常處理語句,因為並不覺得有什麼優點的地方,認為只不過是檢查錯誤時才使用的,沒多大必要。 其實異常處理語句結構可以遮蔽錯誤,當在try中的語句發生錯誤時,指令碼執行不至於中斷掉。 特別是在javascript中,異常處理結構是相當的有用,很常用。 結構如下: try { document.w

C語言實現try catch處理

我們都知道,在Java、C#等高階程式語言中,都自帶有異常處理機制,其基本結構如下: try{ 程式語句; }catch(Exception ex){ 異常處理; } 這樣做不但可以防止程式異常終止,而且在出現錯誤時可以及時作一些釋放資源處理,對程式能繼續健壯的執行下去尤

深入理解try catch吃掉異常,及catch(Exception e)中的異常

package test.s; public class yichang { public static void main(String[] args) throws Exception{ try{ double a=aa(); System.out.