摘要:結(jié)果如下十一月上午嚴(yán)重靜態(tài)的方法創(chuàng)建了一個參數(shù)的對象,這個對象會將輸出發(fā)送到也就是發(fā)送到對象初始化的字符串到緩沖區(qū)中,執(zhí)行到構(gòu)造器新建對象的時候,就已經(jīng)拿到了這個對象輸出到流緩沖區(qū)的字符,但是由于我們只是獲得了字符,所以我們調(diào)用獲取到了其中
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); } } }
結(jié)果如下
十一月 10, 2017 9:34:31 上午 LoggingException嚴(yán)重: LoggingException at LoggingExceptions.main(LoggingExceptions.java:20) CaughtLoggingException
靜態(tài)的Logger方法創(chuàng)建了一個string參數(shù)的logger對象,這個logger對象會將輸出發(fā)送到system.err(也就是發(fā)送到logger對象初始化的字符串到緩沖區(qū)中),執(zhí)行到構(gòu)造器新建對象trace的時候,trace就已經(jīng)拿到了這個logger對象輸出到流緩沖區(qū)的字符,但是由于我們只是獲得了字符,所以我們調(diào)用 printStackTrace(new PrintWriter(trace))獲取到了其中的異常信息,并通過trace獲取錯誤信息到緩沖區(qū)中,然后我們要輸出緩沖區(qū)重的字符串,調(diào)用 logger.severe(trace.toString()); 方法對字符串進(jìn)行打印,并把結(jié)果寫入到logger中,最后在main方法里執(zhí)行try語句的時候會加載LoggingException的構(gòu)造器,從而通過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個一唯數(shù)組,每一個一唯數(shù)組的長度是2 for (int i = 0; i < initialSize; i++) { // 這里開始遍歷1唯數(shù)組,然后給1唯數(shù)組里的每個元素進(jìn)行賦值 fields[i] = new Object[]{null, null}; } } public String toString() { StringBuilder result = new StringBuilder(); for (Object[] object : fields) { // object遍歷的數(shù)組是1唯數(shù)組的個數(shù),1唯數(shù)組有幾個就遍歷幾次, // 由于object取出的是每一個一唯數(shù)組,所以object[0]取出的是每一個一唯數(shù)組里每一個元素的值,由于上面指定1唯數(shù)組的長度是2,所以取0,和1兩個下標(biāo)進(jìn)行遍歷,添加到緩沖區(qū)然后返回數(shù)組里的所有內(nèi)容 // object[0]取出的是每一個1唯數(shù)組, 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的容器,我們通過調(diào)用DynamicFieldException的initcause方法來把其他的異常鏈接起來,也可以通過exception的構(gòu)造器來傳入一個異常,這樣我們可以追蹤到異常最初發(fā)生的位置,不過需要注意的是,在調(diào)用setfiled的時候,如果跑出文件找不到異常(屬于查找才有的異常類型,而不是設(shè)置字段應(yīng)該拋出的異常類型),所以我們需要用接受cause參數(shù)的構(gòu)造器把文件找不到異常轉(zhuǎn)換成運行時異常
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67996.html
摘要:一旦異常被拋出,就表明錯誤已無法挽回,也不能回來繼續(xù)執(zhí)行。這種在編譯時被強制檢查的異常稱為被檢查的異常。通過獲取原始異常。構(gòu)造器對于在構(gòu)造階段可能會拋出異常,并要求清理的類,最安全的做法是使用嵌套的子句。 點擊進(jìn)入我的博客 Java異常處理的目的在于通過使用少于目前數(shù)量的代碼來簡化大型、可靠的程序的生成,并且通過這種方式可以使你更自信:你的應(yīng)用中沒有未處理的錯誤。 12.1 概念 異...
摘要:前言編程思想這本書,陸陸續(xù)續(xù)讀了年,終于基本都瀏覽了一遍。每個對象對外暴露接口,程序通過對象暴露的接口向?qū)ο蟀l(fā)送消息,獲取該對象的服務(wù)能力。異常處理異常處理,為編寫程序階段提供了一種預(yù)見性的防止程序崩潰的出路。 前言 《Java編程思想》這本書,陸陸續(xù)續(xù)讀了1年,終于基本都瀏覽了一遍。通過這本書,試圖理解作者的想法,才真的體會到Java思想。感謝本書的作者,不僅講述了java的語法,更...
摘要:總結(jié)異常總的來說還是很重要的,也是保障程序健壯性很重要的一欄,并且可以達(dá)到立竿見影的效果,這里只是基本總結(jié)了異常的一些常見問題,很多還得在自己運用的過程中去探索。 概述 說起異常,我就想起了Bug,也就是常說的信春哥,無Bug,什么是Bug呢?我理解的Bug就是沒有按照自己原先假想的邏輯去執(zhí)行,這其中包括了兩個方面,一方面是代碼語法問題,一方面是邏輯問題,就比如正常邏輯買了東西要付款,...
摘要:系列博文目錄編程思想學(xué)習(xí)錄連載之一切都是對象編程思想學(xué)習(xí)錄連載之初始化與清理編程思想學(xué)習(xí)錄連載之內(nèi)部類編程思想學(xué)習(xí)錄連載之異常本篇文章將講述關(guān)于異常的相關(guān)知識注本文首發(fā)于公眾號,可長按或掃描下面的小心心來訂閱基本概念使用異常來提供一致性的錯 showImg(https://segmentfault.com/img/remote/1460000013228854); Thinking ...
閱讀 2731·2023-04-26 02:28
閱讀 2565·2021-09-27 13:36
閱讀 3134·2021-09-03 10:29
閱讀 2762·2021-08-26 14:14
閱讀 2111·2019-08-30 15:56
閱讀 842·2019-08-29 13:46
閱讀 2616·2019-08-29 13:15
閱讀 461·2019-08-29 11:29