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