资讯专栏INFORMATION COLUMN

java编程思想代码分析(一)12.4.1:异常

MingjunYang / 1294人阅读

摘要:结果如下十一月上午严重静态的方法创建了一个参数的对象,这个对象会将输出发送到也就是发送到对象初始化的字符串到缓冲区中,执行到构造器新建对象的时候,就已经拿到了这个对象输出到流缓冲区的字符,但是由于我们只是获得了字符,所以我们调用获取到了其中

</>复制代码

  1. import java.io.PrintWriter;
  2. import java.io.StringWriter;
  3. import java.util.logging.Logger;
  4. /**
  5. * Created by 2017 on 2017/11/10.
  6. */
  7. class LoggingException extends Exception{
  8. private static Logger logger = Logger.getLogger("LoggingException");
  9. public LoggingException() {
  10. StringWriter trace = new StringWriter();
  11. printStackTrace(new PrintWriter(trace));
  12. logger.severe(trace.toString());
  13. }
  14. }
  15. public class LoggingExceptions {
  16. public static void main(String[] args) {
  17. try {
  18. throw new LoggingException();
  19. } catch (LoggingException e) {
  20. System.err.println("Caught"+e);
  21. }
  22. }
  23. }

结果如下

</>复制代码

  1. 十一月 10, 2017 9:34:31 上午 LoggingException
  2. 严重: LoggingException
  3. at LoggingExceptions.main(LoggingExceptions.java:20)
  4. 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异常链

</>复制代码

  1. /**
  2. * Created by 2017 on 2017/11/12.
  3. */
  4. public class Test {
  5. public static void main(String[] args) {
  6. DynamicFields df = new DynamicFields(3);
  7. System.out.println(df);
  8. try {
  9. df.setField("d", "a value of d");
  10. df.setField("killer47", 47);
  11. df.setField("fatkiller48", 48);
  12. System.out.println(df);
  13. df.setField("d", "a new value of d");
  14. df.setField("thinkiller", 11);
  15. System.out.println("df:" + df);
  16. System.out.println("df.getField("d")" + df.getField("d"));
  17. Object field = df.setField("d", null);
  18. } catch (NoSuchFieldException e) {
  19. e.printStackTrace();
  20. } catch (DynamicFieldException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. class DynamicFieldException extends Exception {}
  26. class DynamicFields {
  27. private Object[][] fields;
  28. public DynamicFields(int initialSize) {
  29. this.fields = new Object[initialSize][2];
  30. // 这里的长度是由用户指定的,里面存储的是initialsize个一唯数组,每一个一唯数组的长度是2
  31. for (int i = 0; i < initialSize; i++) {
  32. // 这里开始遍历1唯数组,然后给1唯数组里的每个元素进行赋值
  33. fields[i] = new Object[]{null, null};
  34. }
  35. }
  36. public String toString() {
  37. StringBuilder result = new StringBuilder();
  38. for (Object[] object : fields) {
  39. // object遍历的数组是1唯数组的个数,1唯数组有几个就遍历几次,
  40. // 由于object取出的是每一个一唯数组,所以object[0]取出的是每一个一唯数组里每一个元素的值,由于上面指定1唯数组的长度是2,所以取0,和1两个下标进行遍历,添加到缓冲区然后返回数组里的所有内容
  41. // object[0]取出的是每一个1唯数组,
  42. result.append(object[0] + ": " + object[1] + "
  43. ");
  44. }
  45. return result.toString();
  46. }
  47. private int hasField(String id) {
  48. for (int i = 0; i < fields.length; i++) {
  49. if (id.equals(fields[i][0]))
  50. return i;
  51. }
  52. return -1;
  53. }
  54. private int getFieldNumber(String id) throws NoSuchFieldException {
  55. int fieldNum = hasField(id);
  56. if (fieldNum == -1) {
  57. throw new NoSuchFieldException();
  58. }
  59. return fieldNum;
  60. }
  61. private int makeField(String id) {
  62. for (int i = 0; i < fields.length; i++) {
  63. if (fields[i][0] == null) {
  64. fields[i][0] = id;
  65. return i;
  66. }
  67. }
  68. // 如果空间满了,那就在造一个空间
  69. Object[][] temp = new Object[fields.length + 1][2];
  70. for (int i = 0; i < fields.length; i++) {
  71. temp[i] = fields[i];
  72. }
  73. temp[fields.length] = new Object[]{null, null};
  74. fields = temp;
  75. return makeField(id);
  76. }
  77. public Object getField(String id) throws NoSuchFieldException {
  78. return fields[getFieldNumber(id)][1];
  79. }
  80. public Object setField(String id, Object value)
  81. throws DynamicFieldException {
  82. if (value == null) {
  83. DynamicFieldException dfe = new DynamicFieldException();
  84. dfe.initCause(new NullPointerException());
  85. throw dfe;
  86. }
  87. int fieldNumber = hasField(id);
  88. if (fieldNumber == -1) {
  89. fieldNumber = makeField(id);
  90. }
  91. Object result = null;
  92. try {
  93. result = getField(id);
  94. } catch (NoSuchFieldException e) {
  95. throw new RuntimeException(e);
  96. // e.printStackTrace();
  97. }
  98. fields[fieldNumber][1] = value;
  99. return result;
  100. }
  101. }

底层类似于一个MAP的容器,我们通过调用DynamicFieldException的initcause方法来把其他的异常链接起来,也可以通过exception的构造器来传入一个异常,这样我们可以追踪到异常最初发生的位置,不过需要注意的是,在调用setfiled的时候,如果跑出文件找不到异常(属于查找才有的异常类型,而不是设置字段应该抛出的异常类型),所以我们需要用接受cause参数的构造器把文件找不到异常转换成运行时异常

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67996.html

相关文章

  • Java编程思想》笔记12.通过异常处理错误

    摘要:一旦异常被抛出,就表明错误已无法挽回,也不能回来继续执行。这种在编译时被强制检查的异常称为被检查的异常。通过获取原始异常。构造器对于在构造阶段可能会抛出异常,并要求清理的类,最安全的做法是使用嵌套的子句。 点击进入我的博客 Java异常处理的目的在于通过使用少于目前数量的代码来简化大型、可靠的程序的生成,并且通过这种方式可以使你更自信:你的应用中没有未处理的错误。 12.1 概念 异...

    Vultr 评论0 收藏0
  • Java编程思想》读后总结(

    摘要:前言编程思想这本书,陆陆续续读了年,终于基本都浏览了一遍。每个对象对外暴露接口,程序通过对象暴露的接口向对象发送消息,获取该对象的服务能力。异常处理异常处理,为编写程序阶段提供了一种预见性的防止程序崩溃的出路。 前言 《Java编程思想》这本书,陆陆续续读了1年,终于基本都浏览了一遍。通过这本书,试图理解作者的想法,才真的体会到Java思想。感谢本书的作者,不仅讲述了java的语法,更...

    hufeng 评论0 收藏0
  • Java编程思想》 -- 异常总结

    摘要:总结异常总的来说还是很重要的,也是保障程序健壮性很重要的一栏,并且可以达到立竿见影的效果,这里只是基本总结了异常的一些常见问题,很多还得在自己运用的过程中去探索。 概述 说起异常,我就想起了Bug,也就是常说的信春哥,无Bug,什么是Bug呢?我理解的Bug就是没有按照自己原先假想的逻辑去执行,这其中包括了两个方面,一方面是代码语法问题,一方面是逻辑问题,就比如正常逻辑买了东西要付款,...

    Pocher 评论0 收藏0
  • Java编程思想学习录(连载之:异常

    摘要:系列博文目录编程思想学习录连载之一切都是对象编程思想学习录连载之初始化与清理编程思想学习录连载之内部类编程思想学习录连载之异常本篇文章将讲述关于异常的相关知识注本文首发于公众号,可长按或扫描下面的小心心来订阅基本概念使用异常来提供一致性的错 showImg(https://segmentfault.com/img/remote/1460000013228854); Thinking ...

    pkhope 评论0 收藏0

发表评论

0条评论

MingjunYang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<