1. 程式人生 > >java-深入篇-java的異常處理

java-深入篇-java的異常處理

或許大家都試過這樣的一種經歷:不管是玩手機還是電腦,在執行一個軟體的時候,有時候會無端端的崩潰掉。這種情況在就連qq在早期的時候也會發生。當然,不僅是他,就連我們使用的系統,也會有這種情況。比如windows就比較喜歡彈出一個提交錯誤資訊報告,告訴你程式哪裡有問題了,要重啟。你按下確定鍵後,他就幫你重新啟動,你要是按了其他,他就直接退出了。這要是在平時倒沒什麼,但是如果你在玩遊戲玩到刺激的時候忽然掛掉的話,那才叫心痛啊是吧。當然,沒有什麼程式是不會出問題的,作為開發者,我們應該做的就是盡力去避免出現bug,以免影響使用者對軟體的體驗度。同時,一旦出現了錯誤,我們也應該儘快去進行修復,而基於這一原則,就誕生我們今天的主角——java的異常處理。

什麼叫異常處理

java中的異常處理是基於面向物件的一種執行態錯誤處理機制,通過對異常資訊的封裝實現對使用者非法操作、引數設定異常、硬體系統異常,執行時網路狀態更換等在執行態中可能出現的異常資訊的處理機制。

異常處理機制的體系結構

前面說到異常處理是基於面向物件而實現的,也即是說java把大部分可能存在的異常資訊都封裝成一個個對應的類了。當然,我們也可以在原有類的基礎上進行拓展。這就涉及了異常處理機制的體系結構:
* 繼承結構

  Throwable
    |- Error      系統級錯誤
    |- Exception  可修復的異常
        |- 其他Exception
        |- RuntimeException
            |- NullPointerException
            |- ArrayIndexOutOfBoundsException
            |- ArithmeticException
            |- NumberFormatException
            |- ClassCastException
            |- InputMismatchException
            ...

在異常處理機制中,為了方便對異常資訊進行跟蹤,一般設定異常資訊的內容如下:

  錯誤資訊:
        *)型別名稱
        *)提示訊息
        *)行號

案例說明:

package testabstractclass;

import java.io.IOException;
public class Test1 {

    public static void main(String[] args) throws IOException{
        int i = 1;
        i = i/0;
        System.out.println(i);
    }
}

執行該程式,報錯如下:

這裡寫圖片描述
你看,這是一個用整數去除以0時,系統報出的異常。在這裡我們就可以清晰地看到這個異常是什麼意思,並且該異常出現的位置都已經顯示出來了,如此我們就可以直接在程式碼中定位到該位置並且對錯誤進行修改,這就是異常處理機制最大的好處:跟蹤錯誤程式碼。並且,還有一個比較重要的好處,就是對於一些可修復的程式來說,我們可以直接捕獲到這個異常,並且直接修改修復它,從而避免了系統崩潰的發生。同樣的例子,我們進行修改如下:

package testabstractclass;

import java.io.IOException;
public class Test1 {

    public static void main(String[] args) throws IOException{
        int i = 1;
        try {
            i = i/0;
        } catch (Exception e) {
            i += 1;
        }

        System.out.println(i);
    }
}

執行結果,你會驚喜地發現,最後打印出來的是2,而不是報錯。這就是因為我們在程式中捕獲到了這個異常並且做出了相應的修改。那麼,由我們的程式碼便引出了下面的一個問題:

如何捕獲異常:

在java中,捕獲異常的格式可以簡述為下面這樣:

try{
可能發生異常的程式碼塊
}catch(可以捕獲的異常1){
處理異常1的程式碼
}catch(可以捕獲的異常2){
處理異常2的程式碼
}finally{
處理完所有異常後一定會執行的程式碼。
在這裡注意的事。如果在這裡沒有出現異常,最終也會執行這行程式碼
}

注意,在這裡,格式是可以發生變化的,我們可以增加catch塊,也可以不需要finally塊。但是我們總不能說因為可以省略就可以不說吧,因此在這裡便列出了一個相對完善的包含所有異常關鍵字的格式,它的流程如下:至於其他的格式,你們可以根據這個來參考實現:
這裡寫圖片描述

如何處理異常的兩種方式

在上面的程式碼中,我們實現瞭如何檢測程式碼異常以及處理這個異常。但是對於一些異常來說,是難以實際去修復的,那怎麼辦呢?常見的一個方法是:編寫一個異常處理類,當我們捕獲到任何異常時,都將其進行統一的處理,比如在軟體上線時,我們不可能一個一個使用者說:哦,你這裡出現了這個問題,我給你修復了,你用我修復的這個吧。要是這樣的話,鐵定會把開發者給累死啊,怎麼辦呢?我們就把說有使用者出現的錯誤資訊集中發到開發者的郵箱,然後開發者進行修改,測試沒問題之後,就對外公佈說:我們的版本升級了,更好玩哦,快來更新吧!你看,這就是為什麼我們要更新的好處啦。好,下面乾貨走起,以android中處理錯誤資訊為例,請看:

/**
 * 同一處理異常
 * @author 明立
 *
 */
//Throwable是所有異常的父類,這裡使用的技術就是多型了
    public static void handleException(Throwable mThrowable){

        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);

        mThrowable.printStackTrace(printWriter);
        String throwableinfo = stringWriter.toString();
        //isRelease,版本標誌符
        //true:上線版本
        //false:開發版本
        if (isRelease) {
        //將異常資訊傳送至伺服器,由伺服器發郵件給開發者
        }else {
        //在Log上列印錯誤資訊
        }
    }
}

當然,還有一種情況,即當我們還沒捕獲到異常的時候,程式就已經崩潰了,那怎麼辦,聰明的程式設計師老大哥們已經想好了處理辦法,即重寫一個類繼承UncaughtExceptionHandler方法捕獲異常並提示使用者並在兩秒後重啟應用,這就避免了你崩潰後用戶直接把你刪掉的結局。乾貨如下:

/**
 * 程式異常crach時處理類(自動重啟)
 * @author 明立
 *
 */
public class CrachHandler implements UncaughtExceptionHandler {
    //程式的Application實現類,宣告週期為應用建立到應用徹底銷燬
    private CApplication mApplication;

    public CrachHandler(CApplication mApplication) {
        super();
        new Thread().start();
        this.mApplication = mApplication;
    }

    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        // 用上面的ExceptionHandle類聯網傳送錯誤資訊
        ExceptionHandle.handleException(throwable);

    //出現自動重啟
        new Thread(){
            public void run() {
                Looper.prepare();
                Toast.makeText(mApplication, "程式出錯,自動重啟", Toast.LENGTH_SHORT).show();
                Looper.loop();
            };}.start();

            try {
                Thread.sleep(2000);
            } catch (Exception e) {
                ExceptionHandle.handleException(e);
            }
            //兩秒後自動重啟軟體,用peddingIntent實現
            Intent intent = new Intent(mApplication,MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(mApplication, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
            AlarmManager alarmManager = (AlarmManager) mApplication.getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(alarmManager.RTC, System.currentTimeMillis()+2000, pendingIntent);
            mApplication.exit();
    }

}

當然,在這裡將Android可能有點超綱了,但實際未然,因為我們介紹完java深入知識點之後,就會正式接觸到Android開發,而期間在各方面可能都會使用到異常,因此在此粘出來,以來讓大家看看Android和Java之間的聯絡。二來也可以讓大家提前掌握這個知識點。而如果說想要深入去理解何為異常處理機制的話,可以參見這篇部落格(真的是寫得非常詳細,極力推薦):
java提高篇-java異常處理

下一篇:Java的多執行緒實現,敬請期待:
如果對文章有疑問,可在下方評論指出,共同探討~

相關推薦

java-深入-java異常處理

或許大家都試過這樣的一種經歷:不管是玩手機還是電腦,在執行一個軟體的時候,有時候會無端端的崩潰掉。這種情況在就連qq在早期的時候也會發生。當然,不僅是他,就連我們使用的系統,也會有這種情況。比如windows就比較喜歡彈出一個提交錯誤資訊報告,告訴你程式哪裡有問

Java提高——Java 異常處理

異常的概念異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。比如說,你的程式碼少了一個分號,那麼執行出來結果是提示是錯誤java.lang.Error;如果你用System.out.println(11/0),那麼你是因為你用0做了除數,會丟擲java.lang.Arithmet

Java之今天的異常處理了嗎

java 輸入 也會 包裝 應用程序 ans 捕獲 子類 子句 異常:指在程序運行過程中發生的異常事件,比如除0溢出、數組越界、文件找不到等,這些事件的發生將阻止程序的正常運行。 (這裏需要註意,異常字面上的意思就是異於平常的錯誤,這裏要和程序本身的設計錯誤區別開。筆者開始

java的專題之異常處理——將異常處理運用在用戶管理系統中(很重要)

ava 例子 AS 異常處理 構造方法 str run 用戶 per 如何讓我們的異常處理變得足夠靈活—— 我們可以自己創建一個異常類(所有異常的通用操作) 在用戶管理系統中具體操作如下: 1、創建一個UserException的類 2、找到Superclass,點擊Bro

Java學習筆記之異常處理

span 怎麽辦 空指針 處理 異常處理 空指針異常 一個 算數 輸入 一.異常的分類   1.由Java虛擬機拋出的異常(Error):程序無法處理的問題,用戶不用去進行處理(虛擬機錯誤丶內存溢出錯誤丶線程死鎖)    2.Exception異常:程序本身可以進行處理的異

Java框架-SpringMVC統一異常處理、ssm框架整合

1. SpringMVC中異常處理 1.1 各層處理異常原則即實現方法 1.1.1 各層處理異常原則 dao:不處理,拋異常; service:不處理,拋異常; controller/servlet:必須處理,否則錯誤資訊將直接在瀏覽器顯示給使用者看。 1.1.2 異

005 異常處理 java基礎學習總結——異常處理

 java基礎學習總結——異常處理 一、異常的概念   異常指的是執行期出現的錯誤,也就是當程式開始執行以後執行期出現的錯誤。出現錯誤時觀察錯誤的名字和行號最為重要。    1 package cn.javastudy.summary; 2 3 p

Java學習日常(異常處理

學習內容 Java 的異常處理方法; 產生的原因有兩點: 1.編譯時的錯誤; 2.執行時的異常(不允許發生); 處理方法: 使用try catch; 程式碼驗證 public class Demo1 { public static void

Java中常用的異常處理情況及關於開發中異常處理的建議

cloneabl 軟件 完整性 內置 加載類 異常信息 dstat 應用程序 dsta 本周四老師由一個簡單程序將問題引出,講授了Java中異常處理的情況。根據課件內容及上網查閱資料,將關於JAVA項目中的常用的異常處理情況總結如下: 首先什麽是異常(Exception

Java中常用的異常處理情況課件動手動腦

1:請閱讀並執行AboutException.java示例,然後通過後面的幾頁PPT瞭解Java中實現異常處理的基礎知識。 import javax.swing.*; class AboutException { public static void main(String[] a) { int i=1

Java中常見的異常處理彙總

1. java.lang.nullpointerexception  這個異常大家肯定都經常遇到,異常的解釋是"程式遇上了空指標",簡單地說就是呼叫了未經初始化的物件或者是不存在的物件,這個錯誤經常出現在建立圖片,呼叫陣列這些操作中,比如圖片未經初始化,或者圖片建立時的路徑錯誤等等。對陣列操作中出現

java專案中的異常處理

java專案中的常用的異常處理情況 1)為可恢復的錯誤使用檢查型異常,為程式設計錯誤使用非檢查型錯誤。   選擇檢查型還是非檢查型異常,對於Java程式設計人員來說,總是讓人感到困惑。檢查型異常保證你對錯誤條件提供異常處理程式碼,這是一種從語言到強制你編'寫健壯的程式碼的一種方式,但同時會引入大量

Java程式設計中關於異常處理的10個要點

Java程式設計中關於異常處理的10個要點 如果是可恢復錯誤,使用檢查型異常;如果是程式設計錯誤,使用非檢查型異常。許多Java程式設計人員都很苦惱,到底是該選擇檢查型異常還是非檢查型異常。檢查型異常是一種從語言到強制你編寫程式碼的一種方式,可以保證你對錯誤條件提供異常處理程式碼,但同時也會引入大量雜

JAVA中常用的異常處理情況

1.java.lang.nullpointerexception程式遇上空指標 這個異常大家肯定都經常遇到,異常的解釋是"程式遇上了空指標",簡單地說就是呼叫了未經初始化的物件或者是不存在的物件,這個錯誤經常出現在建立圖片,呼叫陣列這些操作中,比如圖片未經初始化,或者圖片建立時的路徑錯誤等等。對陣列操作中出

java學習——關於搜尋異常處理的總結

  根據網上的資料可以知道,異常處理是為了檢測到程式執行中發生的非正常情況的檢測而設立的一種機制,異常的英文單詞是exception,字面翻譯就是“意外、例外”的意思,也就是非正常情況。關於平常我們經常遇到的一些異常有:使用空的引用、陣列下標越界、記憶體溢位錯誤等,這些異常如果不加以解決的話會造成程

Java 常用類之異常處理

Java異常類是對於程式中可能出現的錯誤或者異常的一種處理方式。在設計程式的過程中,對於可能出現的異常錯誤,比如說使用者輸入錯誤,裝置錯誤,磁碟滿了或者程式碼錯誤等等,通常採用異常處理的方式來進行處理可能的錯誤。 JAVA的異常處理機制:如果某個方法不能按照正常的途徑完成任務,就可以通過另一

使用Thumbnailator處理gif圖片時遇到java.lang.ArrayIndexOutOfBoundsException: 4096異常處理

環境 1.7.0_80 在使用Thumbnailator處理gif圖片時,遇到問題: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4096 at com.sun.imageio.plugins.gif.

java程式設計入門4 異常處理

異常處理 異常的定義 1.異常是在程式碼序列執行時出現的非正常事件,是特殊的執行錯誤物件。異常的發生將阻止程式正常執行,並可能出現以下兩種情況。 1)程式執行終止,控制權返回給作業系統 2)程式執行終止,系統宕機崩潰狀態 異常類 1.java提供了以Throwable類為基類的一系列異常類和錯誤類

基於spring框架的java開發中的異常處理

在springmvc框架的中異常處理的方式有兩種: 1,在控制器中使用@ExceptionHandler(xxxException.class)註解修飾一個方法,該註解能夠處理通一個控制器類中的丟擲的xxxExcepiton異常。 使用控制器通知註解@ControllerAdvice

Java 程式設計中關於異常處理的10個最佳實踐

        異常處理是Java 開發中的一個重要部分。它是關乎每個應用的一個非功能性需求,是為了處理任何錯誤狀況,比如資源不可訪問,非法輸入,空輸入等等。Java提供了幾個異常處理特性,以try,catch 和 finally 關鍵字的形式內建於語言自