错误与异常处理
1.异常的分类
try 探测异常 catch
finally之下的语句一定执行
throws定义异常(规约的一部分)
throw直接抛出异常
2.Uncheck vs. Checked
check异常:
- 必须捕获,否则无法通过编译
- 本身出现错误主动抛出
- 调用的方法出现问题,继续抛出
java中任一程序都不会throws一个runtime异常 ,check异常可能会
断言和防御型编程& debugging
1.Assertion 断⾔ :保证程序正确性
- 不应该存在程序发布的版本中
- 只⽤来处理内部错误
- 设置按钮才能打开
2.defensive pngnamig防御式编程
- 处理不正确的情况
- 设置路障:把错误输⼊过滤掉 (隔离仓)->代理模式
3.诊断
①测量:日志、分析工具
②分治:二分查找、切分模块、防狼围栏算法
③切片:与当前输出相关的部分
④寻找差异(版本之间)
4.基于差异的调试
①执⾏次数少的语句更有可能是错的
②软硬件、输⼊⽂件等
5.符号化:⽤符号值输⼊,较复杂
6.调试器 7.网上搜……8.日志
打印debug→发布的软件不应该存在,注释掉
并发(Concurrency)
①多线程程序 ②分布式程序
1.两个处理器共享内存/同⼀台机器上的两个程序,共享⽂件系统
同⼀个java程序内两个线程共享java对象
2.通过管道连接进⾏通讯
进程(私有空间,彼此隔离)=虚拟机
进程拥有整台计算机的资源
多进程之间不共享内存(进程-进程只能消息传递)线程都可以
⼀般进程=程序=应⽤(多个进程)
线程(程序内部的控制机制)=虚拟cpu
①Java提供线程类:对其进⾏继承(不推荐)
②从Runnable 接⼝构造Thread对象
还是需要借⽤thread类中的start来调⽤(唯一调用方法)
Java匿名类
防止rist-condition
①多线程间禁⽌共享数据 ×
②只读⽽不修改 immutable类 × 有时要⽤mutable
③将变量变为线程安全(其每个操作都是原子操作) via装饰模式
- 不要保留别名→彻底销毁
- 在线安集合上 iterator 也是不安全的 (除非lock机制 )
- collection类可能产⽣竞争 (多个放在⼀起)