Checked and Unchecked Exception

首先是一个要不要用checked Exeption的一个讨论 http://www.iteye.com/topic/2038 总结得出的基本原则: 使用Checked Exception还是UnChecked Exception的原则,我的看法是根据需求而定。 如果你希望强制你的类调用者来处理异常,那么就用Checked Exception; 如果你不希望强制你的类调用者来处理异常,就用UnChecked。 那么究竟强制还是不强制,权衡的依据在于从业务系统的逻辑规则来考虑,如果业务规则定义了调用者应该处理,那么就必须Checked,如果业务规则没有定义,就应该用UnChecked。 还是拿用户登陆的例子来说, User login(String username, String password); throws UserNotFoundException, PasswordNotMatchException; try { UserManager.login(xx,xx);; .... 用户登陆以后的主事件流代码 } catch (UserNotFoundException e); { ... 用户名称没有的事件处理,例如产生一个提示用户注册的页...

HttpClient4登陆ITeye

[java lang="java"]import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; public class ...

Start tomcat with port 80 without Linux root user-Use iptables mapping 编辑

In linux system. only root user can use the port small than 1024, so if you change tomcat port to 80 and start without root account, then you will see the following error: java.net.BindException: Permission denied The solution is to use iptables to map port 80 with the default port 8080 [java lang="java"]#map tomcat port:8080 to port:80 , so the external host can access tomcat via both 8080 and 80 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 #let local application to access tomcat via port 80 iptables -t nat -I OUTPUT -p tcp -o lo --dport 80 -j REDIRECT --to-ports 8080 #save mapping, so after linux box reboot, still have these port mapping service iptables save #view existed port mapping iptables -t nat --line-numbers -n -L[/j...

row_number() and partition

一个表有三列,id,name,score,现在要取得每个人分数最高的两门课程 [java lang="sql"] create temp table tmp_xxx as select 1 id,'A' name,80 grade UNION ALL select 2,'A',90 UNION ALL select 3,'A',60 UNION ALL select 4,'B',100 UNION ALL select 5,'B',90 UNION ALL select 6,'B',50; select id,name,grade from ( select id,name,grade, row_number() over (partition by name order by grade desc) as RN from tmp_xxx ) tmp where RN<=2;[/java]

验证数据完整性-MD5算法

MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。 [code lang="java"] public static String encodeMD5Hex(String data) { return DigestUtils.md5Hex(data); } [/code] [code lang="java"] public void testMD5() throws NoSuchAlgorithmException { String data = "md5数字签名"; //可以加入一些混淆值,例如支付宝会给你一个key String salt_key = "1d312ye2shd12q12dfsd"; assertEquals(encodeMD5Hex(data+salt_key), encodeMD5Hex(data+salt_key)); }[/code] maven jar 依赖 ...

Base64编码解码

[java]package com.wilson.EDecryption; import java.io.UnsupportedEncodingException; import junit.framework.Assert; import org.apache.commons.codec.binary.Base64; import org.junit.Test; public class Base64CoderTest { public final static String ENCODING = "UTF-8"; @Test public void testBase64() throws UnsupportedEncodingException { String inputStr="Java加密"; System.out.println("原文:\t" + inputStr); String code = new String(Base64.encodeBase64(inputStr.getBytes(ENCODING)), ENCODING); System.out.println("密文:\t" + code); String outputStr = new String(Base64.decodeBase64(code.getBytes(ENCODING))); System.out.println("解密:\t" + outputStr); Assert.assertEquals(inputStr, outputStr); } ...

对称加密算法-AES

[java lang="java"]package com.wilson.EDecryption; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import junit.framework.Assert; import org.apache.commons.codec.binary.Base64; import org.junit.Test; public class AESCoderTest { @Test public void test() throws Exception { String inputStr = "AES加密"; byte[] inputData = inputStr.getBytes(); System.out.println("原文: \t" + inputStr); // initial key b...

初探JVM内存

1 JVM架构 线程私有内存:程序计数器,Java虚拟机栈,本地方法栈 线程共享内存:Java堆,方法区 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器。如果线程执行的是一个java方法,这个计算器记录的是正在持行的虚拟机字节码指令的地址;如果执行的是Native方法,这个计数器则为空。此区域是java虚拟器规范中唯一没有定义任何OutOfMemoryError情况的区域 Java虚拟机栈:它是描述java方法执行的内存模型:每个方法被执行的时候都会创建一个stack frame用于储存局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈道出栈的过程。 如果线程所请求的栈深度大于虚拟机所永许的深度,将抛出StackOverflowError,如果虚拟机栈可以动态扩展,当扩展时无法申请足够的内存时会抛出OutOfMemoryError。 本地方法栈:与java虚拟机栈作用类...

线程间通信(生产者-消费者模式)

有如下情形线程A向盘子里放桔子(盘子很小只能容得下个桔子)放完桔子后如果其它线程没有来拿桔子则A下次 再放桔子时留在盘子里上次那个桔子就被覆盖掉了(现实并非这样)但我们并不希望这个可口桔子就这样被第 2个 桔子覆盖掉我们理想情况是:线程A每次在盘子里放完个桔子后马上通知其它线程来取这个桔子这时线程A就暂停 放桔子在盘子里其它线程取走桔子的后马上通知A桔子已经被取走这时A继续放下个桔子并通知其它线程来取这 样反复下去(为了不让产生者永久放消费者永久地取可限定生产者共要放100次桔子)……于是放个就取走个所有 桔子都被成功取走 在上述案例子中线程A和线程B的间是生产者和消费者关系线程A生产桔子把桔子在盘子里线程B从盘子里拿走桔 子享受美味而且为了达到生产个拿走个这样对过程线程A必须告诉线程B:桔子已经放好了来拿吧你拿走了我再放 下个当线程B拿走后必须告诉线程A:我把桔子拿走了你快放下个吧线程A和B互相告诉对方动作就是线程...

线程之notify和wait

[java lang="java"]public class MyThreadPrinter2 implements Runnable { private final String name; private final Object prev; private final Object self; private MyThreadPrinter2(String name, Object prev, Object self) { this.name = name; this.prev = prev; this.self = self; } @Override public void run() { int count = 10; while (count > 0) { synchronized (prev) { synchronized (self) { System.out.print(name); count--; self.notify(); } try { prev.wait(); } cat...