Java

静态最终域初始化时抛异常的问题

有时候需要一些预先创建好的对象以便别的类直接使用,这些对象通常都是静态最终常量(static final),通常都是这样创建的:

  1. package org.supermmx.example.misc;
  2.  
  3. public class StaticFinalException {
  4.     public static final Test TEST_1 = new Test("value1");
  5. }
  6.  
  7. class Test {
  8.     public Test(String value) {
  9.     }
  10. }

但如果在构造函数中声明有异常抛出的话,会怎么样呢?

  1. package org.supermmx.example.misc;
  2.  
  3. public class StaticFinalException {
  4.     public static final Test TEST_1 = new Test("value1");
  5. }
  6.  
  7. class Test {
  8.     public Test(String value) throws Exception {
  9.     }
  10. }

编译的结果如下:
 

Java 定时器退出问题

项目中用到了 Timer 每隔一段时间进行一些操作,现在发现有时候莫名其妙地挂在这个计时器上的操作都不做了,用“JConsole”查看其中的线程以后,发现这个定时器线程也不在了(定时器创建的时候带了名字 Timer timer = new Timer("MyTimer"),所以直接能看到),由于日志太多,之前的日志已经找不到了,所以没有办法看是否是有异常发生以及发生在哪里。初步估计,是不是由于 TimerTask 中有异常抛出,如果定时器中没有处理的话,可能就会出问题。所以看了一下 java.util.Timer 的代码:

  1. // 在 TimerThread 中执行任务
  2. Timer.java:101:TimerThread
  3.   // TimerThread 的入口
  4.   // 这里只有一个 try/finally,如果 mainloop 中有异常抛出的话,肯定就结束运行。
  5.   Timer.java:503:TimerThread.run()
  6.     // 主循环体,其中只抓住了 InterruptedException 异常,其他的仍然往外抛。

Java 序列化的问题之二——单例

第二个问题是如何读取应该是单例(Singleton)的序列化数据?当然要保证一是单例,二是数据正确性。Google 出来的所有文章都是一个调:private Object readResolve() { return getInstance(); }。方法没错,肯定要使用 readResolve() 返回一个唯一的实例。但真的可行吗?看下面的程序:

  1. WrongSingletonObject.java
  2.  
  3. public class WrongSingletonObject implements Serializable {
  4.     private static WrongSingletonObject instance;
  5.  
  6.     private String value = "value1";
  7.  
  8.     private WrongSingletonObject() {
  9.     }
  10.  
  11.     public static synchronized WrongSingletonObject getInstance() {
  12.         if (instance == null) {

Java 序列化的问题之一——自定义的类加载器

项目中间用到了 Java 序列化,但碰到了几个问题,可以说道说道。

由于涉及到问题以及解决方法有些繁杂,所以用一套例子来演示各种情况,项目以 [Ant] 编译运行。目录文件如下:

  1. CustomObject.java // 就是我们的主角了,它本身是在缺省的类路径,但其子类都是单独的 jar
  2. |-- SubCustomObject.java // 第一个子类
  3.     |-- plugin1.properties // 第一个子类所对应的信息,让加载器读取
  4. |-- AnotherSubCustomObject.java // 第二个子类
  5.     |-- plugin2.properties // 同上
  6.  
  7. // 主程序
  8. SerializationTest.java
  9.  
  10. // 单例类
  11. CustomObjectUtils.java
  12. // 自定义的类加载器
  13. CustomClassLoader.java
  14.  
  15. // 最简单的对象容器
  16. SimpleCustomObjectHolder.java
  17. // 将包含的对象在序列化时转换成 String,并在逆序列化时再转换回来。
  18. CustomObjectHolder.java
  19. // 列表容器,演示 Collection

Java 的字体替换

不知道什么时候起,中文的斜体和粗体开始流行起来,还有很多人还特意地去追求这种效果。中文写作的习惯是不用斜体和粗体的,而是使用完全不同的字体来区别不同的内容,一般是楷体对应斜体,黑体对应粗体。对于英文来讲,斜体粗体或者粗斜体和正常的字体也是不同的字体,需要重新设计,但都属于同一族(Family)的。对于汉字,这种效果一般是使用一定的算法将字体倾斜或者加粗(当然这种算法并不只是针对汉字)。

JSON Java API 的一个 bug

用到 [JSON] 的官方 [Java API] 时,遇到了一个 bug,当解析“{"a":[a,b,”,会导致 OutOfMemoryException。简单来说,就是整个 JSON 字符串中,以一个不完整的 JSON Array 结尾并且最后一个有效字符是逗号时,会引发这个问题。补丁如下:

  1. --- src/org/json/JSONArray.java 2008-02-02 06:59:17 +0000
  2. +++ src/org/json/JSONArray.java 2008-02-02 10:42:30 +0000
  3. @@ -122,8 +126,11 @@
  4.              switch (x.nextClean()) {

“在 Java 中使用 GNU gettext 实现本地化(L10N)”上线

在使用中发现 Java I18N 和 L10N 也不是那么方便,后来改用了基于 GNU gettext 的 Gettext-Commons,发现还不错,给大家介绍一下,能减少一些工作量。点击[这里]阅读。

在 Java 中使用 GNU gettext 实现本地化(L10N)

Java 本身已经可以很好地国际化(I18N),SUN 网站上也有关于国际化的[教程][文档],其中也包含了如何进行本地化(L10N)的过程。这里所谈的本地化指的是显示出来的字符串的本地化,不涉及数字、货币、日期时间等。Java 本身是如何进行本地化的呢?看一个简单的例子:

  1. I18NExample.java:
  2.  
  3. package org.supermmx.example.i18n;
  4.  
  5. import java.util.Locale;

输入中文以后 Java 并不退出

以前似乎也发现过,不过都没有注意,今天是在一个很简单的情况下出来的,然后稍微试验了一下就发现,在输入中文以后,程序就不能正常退出了,当然,没有直接使用 System.exit() 方法来暴力退出。这里说一下 Java 的退出方法,一般有两种:

  • 调用 System.exit():这就直接让 JVM 退出,相对来讲比较暴力,它不管你还有其他什么线程在运行,直接退出。
Syndicate content