Java异常处理-原理及优化建议

1 异常层次结构 异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。 Java异常类层次结构图: 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。 Throwable: 有两个重要的子类:*Exception(异常)和 Error(错误)*,二者都是 Java 异常处理的重要子类,各自都包含大量子类。 Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

java内存模型之[JMM][重排序][happens-before]

1.并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同 步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换 信息。在命令式编程中,线程之间的通信机制有两种:*共享内存和消息传递*。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内 存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状 态,线程之间必须通过明确的发送消息来显式进行通信。 同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模 型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之 间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前, 因此同步是隐式进行的。 Java 的并发采用的是共享内存模型,Java 线程之间的通信总是隐式进行,整个通 信过程对程序员完全透明。如果编写多线程程序的 Java 程序员不理解隐式进行的 线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。

java中位运算技巧

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。 运算符 含义 描述 【&】 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 【|】按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1 【^】 按位异或 若参加运算的两个二进制位值相同则为0,否则为1 【~】 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0 【<<】 左移 用来将一个数的各二进制位全部左移N位,右补0 【>>】右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

Java 内省(Introspector)

内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。  JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。  例如类Use : public class User { private String name; private String address; public String getName() { return name; } public void setName(String name) { this.

可重入锁

可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。比如ReentrantLock 和synchronized 都是 可重入锁 直接放代码 public class SubService { ReentrantLock lock = new ReentrantLock(); public void subService1() { lock.

数据库设计三范式和反范式

数据库范式 范式的级别 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 范式越高,冗余最低,一般到三范式,再往上,表越多,可能导致查询效率下降。所以有时为了提高运行效率,可以让数据冗余(反三范式,一般某个数据经常被访问时,比如数据表里存放了语文数学英语成绩,但是如果在某个时间经常要得到它的总分,每次都要进行计算会降低性能,可以加上总分这个冗余字段)。 后面的范式是在满足前面范式的基础上,比如满足第二范式的一定满足第一范式。 第一范式(1NF):确保每一列的原子性 如果每一列都是不可再分的最小数据单元,则满足第一范式。 但是具体地址到底要不要拆分 还要看具体情形,比如看看将来会不会按国家或者省市进行分类汇总或者排序,如果需要,最好就拆,如果不需要而仅仅起字符串的作用,可以不拆,操作起来更方便。 第二范式:非键字段必须依赖于键字段 如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。例如: 第三范式:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

自定义序列化之Externalizable接口

Externalizable简介 Externalizable是一种优先级要高于 Serializable 的序列化机制接口, 这个接口提供了writeExternal()和readExternal()方法用于指定序列化哪些属性。 Externalizable接口与Serializable接口区别 * 1 Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器 * 2 transient关键字对Externalizable无效 代码事例 公共抽象实体类AbstractDO public abstract class AbstractDO implements Externalizable { private static final long serialVersionUID = -1679770357930200297L; private Long id; private Date createTime; private Date updateTime; public Long getId() { return id; } public void setId(Long id) { this.