Java编程流程

单元测试异常处理
日志和性能指标

防御式编程

防御式编程,就是持怀疑态度审视所有的代码
契约式编程要求我们在『前提条件』、『后继条件』和『不变量条件』进行契约的检查

调试

Debug
  --使用 IDEA 的断点调试功能,查看程序的运行过程
  -- 设置断点 .开启调试会话 --单步调试 step over
   IDEA在Debug时默认阻塞级别是ALL,会阻塞其它线程,只有在当前调试线程走完时才会走其它线程
  01.采用Debug来追踪代码的运行流程,通常在程序运行过程中出现异常,
     启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。
  02.可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码

异常处理

1.问题先行?
  01.什么是异常处理机制?what
  02.哪些会发生异常? where
  03.谁来处理异常? who
  04.怎么处理异常? how
  05.关于异常的处理理念有哪些?idea
  06.常见的异常有哪些,请举例,默认的处理机制?
    默认处理机制:退出
  07.异常的一些比较以及异常的链化
2.异常的比较
throw 抛出异常,触发Java异常处理机制, 代表异常退出,执行代码不确定,由异常处理机制动态处理
常见的对比 -- return 代表正常退出,返回的位置是确定的,即上一级调用者
3.怎么处理异常:
  有2种不同的处理方式:
   01.使用try…catch…finally语句块处理它。
   02.或者在函数签名中使用throws 声明交给函数调用者caller去解决
 相关的情况
   通过throw语句手动显式的抛出一个异常。throw语句的后面必须是一个异常对象。
   throw 语句必须写在函数中,执行throw 语句的地方就是一个异常抛出点
   eg:   if(user  == null) {throw new IllegalArgumentException("User对象为空");}       
4.Throwable 类源码
常见的异常有
     RuntimeException 非检查异常
       文件未找到异常:   FileNotFoundException
       空指针异常         NullPointerException
       数组下标越界异常: ArrayIndexOutOfBoundsException
       数字格式异常:     NumberFormatException
     检查异常(CheckedException)
        输入输出异常:     IOException     
错误Error
    java.lang.NoClassDefFoundError
    java.lang.StackOverflowError
    java.lang.OutOfMemoryError
-- itList.getClass() + ":遇到无法解析的对象:" + Thread.currentThread().getStackTrace()[1].getMethodName())
getStackTrace() 返回一个表示该线程堆栈转储的堆栈跟踪元素数组。
  如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。
  如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。
   getStackTrace()[0]表示的是 getStackTrace 方法
  如果有安全管理器,并且该线程不是当前线程,则通过 RuntimePermission("getStackTrace") 
    权限调用安全管理器的 checkPermission 方法,查看是否可以获取堆栈跟踪
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement ele : stackTrace) {
            System.out.println(ele);
        }
产生fail-fast事件,是通过抛出ConcurrentModificationException异常来触发的

测试工具

JUnit
   是一个Java语言的单元测试框架
Mock
  模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象。
  程序员通常创造模拟对象来测试其他对象的行为
  Mockito 是GitHub上使用最广泛的Mock框架,并与JUnit结合使用.
  Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发!
 ​ PowerMock 可以实现完成对private/static/final方法的Mock(模拟),而 Mockito 可以对普通的方法进行Mock
   PowerMock基于Mockito开发,起语法规则与Mockito一致,
     主要区别在于使用方面,以实现完成对private/static/final等方法(也支持mock的对象是在方法内部new出来的)的Mock(模拟)      
  一般使用Mockito的步骤:
      模拟任何外部依赖并将这些模拟对象插入测试代码中
      执行测试中的代码
      验证代码是否按照预期执行

日志系统

日志:
 日志: 记录操作轨迹,监控系统运行状况,回溯系统故障
   打日志,日志收集,日志解读,问题定位   
  日志规范 
  日志等级
  日志框架

监控指标系统

2.为了更好地了解系统的运行情况,往往我们会有多样的metric性能指标来帮助我们了解这里面的情况
  Metric框架设计而言,我们需要考虑的问题就要更多一些了,比如以下必须要解决的问题:
    需要用哪些类型的Metric指标,收集哪些指标数据?
    应用层如何通过Metric框架来收集我们想要的metric指标?
    收集好后的Metric指标如何进行指标的expose?JMX,Console?
例如:
    Flink exposes a metric system that allows gathering and exposing metrics to external systems
     Flink supports Counters, Gauges, Histograms and Meters.

参考:

Linux日志系统以及服务器日志系统 https://ytluck.github.io/os/my-super-os-post-12.html
论分布式系统中Metric框架的设计  https://blog.csdn.net/Androidlushangderen/article/details/100752425

blogroll

social