Java 异常处理机制与最佳实践

这周小组内的学习是探讨 java 异常处理的最佳实践,今天周末,外面太闷,宅在家里对 java 的异常处理的个人立即做一个总结,如有不对的地方欢迎指正~ 一. 谈谈个人对 java 异常处理的看法维基百科对于异常处理的定义是: 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。 java 语言从设计之初就提供了对异常处理的支持,并且不同于其它语言,java 对于异常采取了强校验机制,即对于编译期异常需要 API 调用方显式地对异常进行处理,这种强校验机制被一部分人所钟爱,也有一部分人狂吐槽它。持支持观点的人认为这种机制可以极大的提升系统的稳定性,当存在潜在异常的时候强制开发人员去处理异常,而反对的人则认为强...

阅读全文

转载:为什么要使用 slf4j 而不是 log4j

每一个 java 程序员都知道日志对于任何一个 java 应用程序,尤其是服务端程序是至关重要的,而很多程序员也已经熟悉各种不同的日志库如 java.util.logging、Apache log4j、logback。但如果你还不知道 slf4j(Simple logging facade for Java)的话,那么是时候去在你项目中学习使用 slf4j 了。 在这篇文章中,我们将学习为什么使用 slf4j 比 log4j 或者 java.util.logging 要优秀。自从上次我写 java 程序员的 10 个日志技巧已经有一段时间了,我已经不记得我写的关于日志的一切了。 不管怎样,让我们回到这个话题,slf4j 不同于其他日志类库,与其它有很大的不同。 slf4j(Simple...

阅读全文

理清 CountDownLatch 与 CyclicBarrier 的区别

对于刚接触信号量同学来说,CountDownLatch 和 CyclicBarrier 应该是两个比较容易混淆的组件,它们都能表示让多个线程等待某个特定事件的语义,不过在功能上还是存在一些差别,实际上它们的 关键区别在于参与的线程是否需要阻塞相互等待一起到达事件的位置,然后再继续向下执行。 这句话不是很好理解,我们通过例子来进行说明,首先来看一下 CountDownLatch。我们可以简单将其理解为一个计数器,当初始化一个 count=n 的 CountDownLatch 对象之后,需要调用该对象的 countDown() 方法来对计数器进行减值,直到计数器为 0 的时候,等待该计数器的线程才能继续执行。但是需要注意的一点是,执行 countDown() 方法的线程在执行完减值之后,并...

阅读全文

Java 并发编程:基础篇

一. 线程相关的基本概念1.1 线程的状态线程可以有 6 种状态(如下图所示),定义在 java.lang.Thread.State 枚举中,我们调用线程对象的 getState 方法来获取线程的当前状态。当我们 new 一个线程的时候,这个线程只是被 创建,还未开始运行,只有当我们调用了 start 方法之后,线程才进入 可运行 状态,这个时候线程不是马上开始运行,而是需要等待 CPU 的时间片。可运行状态包含等待 CPU 调度和处于运行两种状态,没有专门的运行态一说。 123456789// 线程的状态定义public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, ...

阅读全文

转载:Cookies 中的那些事儿

HTTP cookies,通常称之为 “cookie”,已经存在很长时间了,但是仍然没有被充分理解。首要问题是存在许多误解,认为 cookie 是后门程序或病毒,却忽视了其工作原理。第二个问题是,对于 cookie 的操作缺少统一的接口。尽管存在这些问题,cookie 仍旧在 Web 开发中扮演者重要的角色,以至于如果没有出现相应的代替品就消失的话,我们许多喜欢的 Web 应用将变的不可用。 一. Cookie 的起源与定义早期的 Web 应用面临的最大问题之一就是如何维持状态。简言之,服务器无法知道两个请求是否来自于同一个浏览器。当时,最简单的办法就是在请求的页面中插入一个 token,然后在下次请求时将这个 token 返回至服务器。这需要在页面的 form 表单中插入一个包含 t...

阅读全文

Spring 框架配置使用指南

本篇用于记录 Spring 框架的配置使用方式,持续更新… 当前支持版本:4.x 注意事项1. BeanFactory 与 ApplicationContext 在容器初始化上的区别BeanFactory 在初始化容器时,并未实例化 bean,直到第一次访问每个 bean 时才真正实例化该 bean;而 ApplicationContext 则在初始化上下文时就完成素有 singleton bean 的实例化。 一. IoC 使用指南1.1 基于 XML 的配置1.1.1 bean的基本配置1<bean id="my-bean" name="myBean, myBean1, myBean2" class="org.zhenchao.bean.MyBean" /> id...

阅读全文

二叉树遍历算法的非递归实现

二叉树遍历中的前、中、后,说的都是双亲节点,而左孩子节点和右孩子节点始终是先左再右。基于递归实现二叉树的遍历算法较为简单,如果放弃递归策略以非递归的方式实现,则所有的遍历的实现都需要 依赖于栈结构。 一. 前序遍历前序遍历算法的遍历次序是 “中-左-右”。 1.1 递归实现123456789101112public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<Integer>(); this.recursion(root, result); return result;}private ...

阅读全文

模式匹配:KMP 算法

KMP 算法是在给定字符串中检索目标字符串的算法,该算法由Knuth、Morris 和 Pratt 三人在 Brute-Force 算法的基础上提出的模式匹配改进算法。该算法消除了 Brute-Force 在进行匹配时,只要遇到不相等字符就需要回退到本次比较起始位置的后一个位置继续开始新一轮的比较的缺点,这样的回退就把过程中所有的比较操作的时间付出全部给否定了,KMP 算法则正是需要在匹配失败时,利用之前的匹配结果,再不回退的情况下开始新的一轮比较,KMP 总会将目标字符串向前移动到合适的位置,保证当前指针前的字符串都是匹配的。 一. KMP 算法执行过程KMP 算法的核心在于一个 next 数组,这个数组在匹配失败时指明了字符串前移的位数,后面我们专门用一小节来讨论 next 数组的...

阅读全文

Powered by hexo & Theme by hiero   Copyright © 2015-2018 浙ICP备 16010916  号,指 · 间 All Rights Reserved.