摘要:結果如下十一月上午嚴重靜態的方法創建了一個參數的對象,這個對象會將輸出發送到也就是發送到對象初始化的字符串到緩沖區中,執行到構造器新建對象的時候,就已經拿到了這個對象輸出到流緩沖區的字符,但是由于我們只是獲得了字符,所以我們調用獲取到了其中
import java.io.PrintWriter; import java.io.StringWriter; import java.util.logging.Logger; /** * Created by 2017 on 2017/11/10. */ class LoggingException extends Exception{ private static Logger logger = Logger.getLogger("LoggingException"); public LoggingException() { StringWriter trace = new StringWriter(); printStackTrace(new PrintWriter(trace)); logger.severe(trace.toString()); } } public class LoggingExceptions { public static void main(String[] args) { try { throw new LoggingException(); } catch (LoggingException e) { System.err.println("Caught"+e); } } }
結果如下
十一月 10, 2017 9:34:31 上午 LoggingException嚴重: LoggingException at LoggingExceptions.main(LoggingExceptions.java:20) CaughtLoggingException
靜態的Logger方法創建了一個string參數的logger對象,這個logger對象會將輸出發送到system.err(也就是發送到logger對象初始化的字符串到緩沖區中),執行到構造器新建對象trace的時候,trace就已經拿到了這個logger對象輸出到流緩沖區的字符,但是由于我們只是獲得了字符,所以我們調用 printStackTrace(new PrintWriter(trace))獲取到了其中的異常信息,并通過trace獲取錯誤信息到緩沖區中,然后我們要輸出緩沖區重的字符串,調用 logger.severe(trace.toString()); 方法對字符串進行打印,并把結果寫入到logger中,最后在main方法里執行try語句的時候會加載LoggingException的構造器,從而通過logger.severe(trace.toString());來打印出logger里的信息到控制臺
12.6.3異常鏈
/** * Created by 2017 on 2017/11/12. */ public class Test { public static void main(String[] args) { DynamicFields df = new DynamicFields(3); System.out.println(df); try { df.setField("d", "a value of d"); df.setField("killer47", 47); df.setField("fatkiller48", 48); System.out.println(df); df.setField("d", "a new value of d"); df.setField("thinkiller", 11); System.out.println("df:" + df); System.out.println("df.getField("d")" + df.getField("d")); Object field = df.setField("d", null); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (DynamicFieldException e) { e.printStackTrace(); } } } class DynamicFieldException extends Exception {} class DynamicFields { private Object[][] fields; public DynamicFields(int initialSize) { this.fields = new Object[initialSize][2]; // 這里的長度是由用戶指定的,里面存儲的是initialsize個一唯數組,每一個一唯數組的長度是2 for (int i = 0; i < initialSize; i++) { // 這里開始遍歷1唯數組,然后給1唯數組里的每個元素進行賦值 fields[i] = new Object[]{null, null}; } } public String toString() { StringBuilder result = new StringBuilder(); for (Object[] object : fields) { // object遍歷的數組是1唯數組的個數,1唯數組有幾個就遍歷幾次, // 由于object取出的是每一個一唯數組,所以object[0]取出的是每一個一唯數組里每一個元素的值,由于上面指定1唯數組的長度是2,所以取0,和1兩個下標進行遍歷,添加到緩沖區然后返回數組里的所有內容 // object[0]取出的是每一個1唯數組, result.append(object[0] + ": " + object[1] + " "); } return result.toString(); } private int hasField(String id) { for (int i = 0; i < fields.length; i++) { if (id.equals(fields[i][0])) return i; } return -1; } private int getFieldNumber(String id) throws NoSuchFieldException { int fieldNum = hasField(id); if (fieldNum == -1) { throw new NoSuchFieldException(); } return fieldNum; } private int makeField(String id) { for (int i = 0; i < fields.length; i++) { if (fields[i][0] == null) { fields[i][0] = id; return i; } } // 如果空間滿了,那就在造一個空間 Object[][] temp = new Object[fields.length + 1][2]; for (int i = 0; i < fields.length; i++) { temp[i] = fields[i]; } temp[fields.length] = new Object[]{null, null}; fields = temp; return makeField(id); } public Object getField(String id) throws NoSuchFieldException { return fields[getFieldNumber(id)][1]; } public Object setField(String id, Object value) throws DynamicFieldException { if (value == null) { DynamicFieldException dfe = new DynamicFieldException(); dfe.initCause(new NullPointerException()); throw dfe; } int fieldNumber = hasField(id); if (fieldNumber == -1) { fieldNumber = makeField(id); } Object result = null; try { result = getField(id); } catch (NoSuchFieldException e) { throw new RuntimeException(e); // e.printStackTrace(); } fields[fieldNumber][1] = value; return result; } }
底層類似于一個MAP的容器,我們通過調用DynamicFieldException的initcause方法來把其他的異常鏈接起來,也可以通過exception的構造器來傳入一個異常,這樣我們可以追蹤到異常最初發生的位置,不過需要注意的是,在調用setfiled的時候,如果跑出文件找不到異常(屬于查找才有的異常類型,而不是設置字段應該拋出的異常類型),所以我們需要用接受cause參數的構造器把文件找不到異常轉換成運行時異常
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67996.html
摘要:一旦異常被拋出,就表明錯誤已無法挽回,也不能回來繼續執行。這種在編譯時被強制檢查的異常稱為被檢查的異常。通過獲取原始異常。構造器對于在構造階段可能會拋出異常,并要求清理的類,最安全的做法是使用嵌套的子句。 點擊進入我的博客 Java異常處理的目的在于通過使用少于目前數量的代碼來簡化大型、可靠的程序的生成,并且通過這種方式可以使你更自信:你的應用中沒有未處理的錯誤。 12.1 概念 異...
摘要:前言編程思想這本書,陸陸續續讀了年,終于基本都瀏覽了一遍。每個對象對外暴露接口,程序通過對象暴露的接口向對象發送消息,獲取該對象的服務能力。異常處理異常處理,為編寫程序階段提供了一種預見性的防止程序崩潰的出路。 前言 《Java編程思想》這本書,陸陸續續讀了1年,終于基本都瀏覽了一遍。通過這本書,試圖理解作者的想法,才真的體會到Java思想。感謝本書的作者,不僅講述了java的語法,更...
摘要:總結異常總的來說還是很重要的,也是保障程序健壯性很重要的一欄,并且可以達到立竿見影的效果,這里只是基本總結了異常的一些常見問題,很多還得在自己運用的過程中去探索。 概述 說起異常,我就想起了Bug,也就是常說的信春哥,無Bug,什么是Bug呢?我理解的Bug就是沒有按照自己原先假想的邏輯去執行,這其中包括了兩個方面,一方面是代碼語法問題,一方面是邏輯問題,就比如正常邏輯買了東西要付款,...
摘要:系列博文目錄編程思想學習錄連載之一切都是對象編程思想學習錄連載之初始化與清理編程思想學習錄連載之內部類編程思想學習錄連載之異常本篇文章將講述關于異常的相關知識注本文首發于公眾號,可長按或掃描下面的小心心來訂閱基本概念使用異常來提供一致性的錯 showImg(https://segmentfault.com/img/remote/1460000013228854); Thinking ...
閱讀 2721·2023-04-26 02:28
閱讀 2551·2021-09-27 13:36
閱讀 3123·2021-09-03 10:29
閱讀 2751·2021-08-26 14:14
閱讀 2101·2019-08-30 15:56
閱讀 830·2019-08-29 13:46
閱讀 2609·2019-08-29 13:15
閱讀 454·2019-08-29 11:29