PIT 06域和流下面的代码是一个文件拷贝的方法设计的是即便抛出异常也会关闭流public static void pit06(String src,String dest) throws IOException { InputStream in null; OutputStream out null; try { in new FileInputStream(src); out new FileOutputStream(dest); byte[] buf new byte[1024]; int n; while((nin.read(buf))0) { out.write(buf,0,n); } } catch(Exception e) { e.printStackTrace(); } finally { if(in!null) { in.close(); } if(out!null) { out.close(); } } }这个程序看起来已经面面俱到了不过可惜的是finally块里当close方法异常时还是会无法关闭流即close的调用可能会导致finally代码块异常结束解决的方法也很简单把close的调用放到嵌套在try catch块里即可} finally { try { if(in!null) { in.close(); } } catch(Exception ex) { ex.printStackTrace(); } try { if(out!null) { out.close(); } } catch(Exception ex) { ex.printStackTrace(); } }PIT 07有毒的括号众所周知Integer.MAX_VALUE的值是2147483647Integer.MIN_VALUE的值是-2147483648但如果这样写public static void pit07() { int i -(2147483648); }这里编译肯定会报错程序会先计算括号里的内容报超出int范围所以你的业务代码里加括号的内容一定要捋清楚防止踩坑。PIT 08三元表达式你会怎么理解这段代码呢public static void pit08() { char x X; int i 0; System.out.println(true?x:0); System.out.println(true?x:i); }毫无疑问这里两次输出的都是变量x的值但并不是XX而是X88。这里可以从条件表达式结果类型的规则来找原因对于表达式的第二个和第三个操作数的类型判断其中有这么三条规则1.如果这两个操作数具有相同的类型那么它就是条件表达式的类型2.如果一个操作数的类型是Tbyte、short、char而另一个操作数是一个int类型的常量表达式它的值可以用T来表示那么条件表达式的类型就是T3. 否则将对操作数的类型进行二进制数字提升而条件表达式的类型就是提升后的类型。第一个输出语句满足第二条所以输出X第二个输出语句满足第三条对char和int进行二进制数字提升之后就是int输出X的Unicode码88。PIT 09转义字符与Unicode当转义字符遇到Unicode简直不要再崩溃/** * from D:\Test\units\Test01.java */ public static void pit09() { System.out.println(Hello Word!); }很简单的一个输出语句却连编译都通不过问题就出在注释里\u是Unicode码的开始即便它在注释里编译器依旧不会放过它可想而知代码里如果有类似现象写不清楚的Unicode该是多么崩溃。PIT 10i-i正常来说满足i-i的整数数值只有0但在程序里还有两个数那就是Integer.MIN_VALUE和Integer.MAX_VALUE这是因为-运算符是对数值进行二进制补码运算的即取反加一而这两个数补码运算后它的低32位等于它本身虽然高位溢出了但会被Java忽略故而依旧满足上述表达式。如果你的程序中有该判断逻辑那就要小心了。精彩待续。。。相关阅读Java雷坑整理1