GeorgeYang'Blog

my technology blog

java涨知识之你未见过的代码

阅读:375 创建时间:16-08-20 12:06:07 tags:java

分享一下最近看到的一些特别的java方面知识

使用Random String来打印出”Hello World”

 public static String randomString(int i){
     Random ran = new Random(i);
     StringBuilder sb = new StringBuilder();    while (true)
     {        int k = ran.nextInt(27);        if (k == 0)            break;

         sb.append((char)('`' + k));
     }    return sb.toString();
 }

 Random(-229985452).nextInt(27) + " " + Random(-147909649).nextInt(27)

如果是一组选择好的随机数,那么事实上他们并不是真正随机的。随机数的算法是根据种子参数来进行计算的,(当前则是 -229985452 或者 -147909649)。每一次当申请一个随机数的时候,它会根据相同的随机数种子来生成一个相同的值 – 打印出”hello world”。

为何两个相差一秒的时间相减会有奇怪的结果

 public static void main(String[] args) throws ParseException {
     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
     String str3 = "1927-12-31 23:54:07";  
     String str4 = "1927-12-31 23:54:08";  
     Date sDt3 = sf.parse(str3);  
     Date sDt4 = sf.parse(str4);  
     long ld3 = sDt3.getTime() /1000;  
     long ld4 = sDt4.getTime() /1000;
     System.out.println(ld4-ld3);
 }




 Java version:

 java version "1.6.0_22"Java(TM) SE Runtime Environment (build 1.6.0_22-b04)Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)

Timezone(TimeZone.getDefault()):

 sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
 offset=28800000,dstSavings=0,
 useDaylight=false,
 transitions=19,
 lastRule=null]

 Locale(Locale.getDefault()): zh_CN

输出结果是353 (译者注:在JDK 1.8上未能重现这个问题, 原题注的JAVA版本是1.6)

很显然只有一秒的差距,但是得到的结果确实353,一个最基本的解释是:时区的问题。在1927年12月31日,上海的时区往后移动了5分钟52秒。

值得一提的是,如果你尝试着去运行这段代码,可能会有不同的结果。根绝Time Zone Database Project 2014 项目。这一时区的改变被挪到了1900-12-31,,因此可能有个343秒的一个变化。

不可捕获的ChuckNorrisException

有一些问题是关于:有没有一种异常是可以被抛出的,但是没人可以捕获它, 应用会崩溃么?或者这样的问题也可以变成“有没有代码可以让java.lang.ChuckNorrisException变成无法捕获的异常?“。

简单的回答是:这是可能的,但是那是有一些前提的。你可以编译一段代码抛出ChuckNorrisException,然后再定义一个ChuckNorrisException类,但是这个类却不在运行时继承自Throwable。但是仅仅如此还是不够的,你必须禁用二进制码检查。“StackOverflow”上有一个答案可以提供这样的一个完整例子

如果你喜欢类似的问题,你可以查看 Java Deathmatch 游戏

博客出处

如何使用优雅的方式抛出一个异常

  try {
                 action.call();
             } catch (Throwable e) {
                 // nothing to do but print a System error as this is fatal and there is nowhere else to throw this
                 IllegalStateException ie;
                 if (e instanceof OnErrorNotImplementedException) {
                     ie = new IllegalStateException("Exception thrown on Scheduler.Worker thread. Add `onError` handling.", e);
                 } else {
                     ie = new IllegalStateException("Fatal Exception thrown on Scheduler.Worker thread.", e);
                 }
                 RxJavaPlugins.getInstance().getErrorHandler().handleError(ie);
                 Thread thread = Thread.currentThread();
                 thread.getUncaughtExceptionHandler().uncaughtException(thread, ie);
             }

这段代码来自rxjava,在一个线程的run方法下抛出一个指定的异常