Java 异常处理
- Java 的基本原理就是“形式错误的代码不会运行”。(编译错误=“形式错误的代码”)
- 捕获错误最理想的是在编译期间,最好在试图运行程序以前。然而,并非所有错误都能在编译期间侦测到。有些问题必须在运行期间解决,让错误的缔结者通过一些手续向接收者传递一些适当的信息,使其知道该如何正确地处理遇到的问题。
摘自 thinking in java 4th
- Java 的基本原理就是“形式错误的代码不会运行”。(编译错误=“形式错误的代码”)
- 捕获错误最理想的是在编译期间,最好在试图运行程序以前。然而,并非所有错误都能在编译期间侦测到。有些问题必须在运行期间解决,让错误的缔结者通过一些手续向接收者传递一些适当的信息,使其知道该如何正确地处理遇到的问题。
摘自 thinking in java 4th
如果匿名类的实现非常简单,比如只包含一个方法的接口,那么匿名类的语法可能看起来很笨重且不明确。使用Lambda表达式可以更简洁地表达单方法类的实例。
1 | public class Demo { |
上面程序的输出结果是:
1 | method_1---0 |
为什么会是这样呢?
因为在计算过程中,使用了Java中间变量缓存机制。在java中,执行自增运算时,会为每一个自增操作分配一个临时变量,如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。运算最终使用的,并不是变量本身,而是被赋了值的临时变量。
j = j++;
==> {int temp = j; j = j + 1; j = temp; }
j = ++j;
==> {j = j + 1; int temp = j; j = temp; }
可变类和不可变类(Mutable and Immutable Objects)的初步定义:
本文介绍一些位运算技巧:
a=0⊕a=a⊕00=a⊕a
由上面两个推导出:
a=a⊕b⊕b
a=a⊕bb=a⊕ba=a⊕b
a=n∧(n−1)
diff=(n∧(n−1))⊕n
在实际开发中常会用到选项,选项开启和关闭可以有效的控制代码执行逻辑。
对于选项,我们可以简单的用类的一个属性去判断。也可以使用一些编程技巧,通过一个数字来表示组合选项。
一个简单的例子如下:
1 | public class ByteOption { |
运算符<<
(左移),>>
(右移)和 >>>
(无符号右移)称为移位运算符。移位运算符的左侧操作数是要移位的值; 右侧操作数指定移位距离。下面是语法描述:
1 | ShiftExpression: |
n << s
的意思是n左移s个bit位,这相当于 n∗2s,注意溢出。n >> s
的意思是n带符号位右移s个bit位,若左操作数是正数,则高位补“0”,若左操作数是负数,则高位补“1”,这相当于 n/2s。n >>>s
的意思是不带符号右移,无论左操作数是正数还是负数,在高位都补“0”。n >> s
(n >> s) + (2 << ~s)
(n >> s) + (2L << ~s)
按位补码运算符: ~
shift表达式的类型是左侧操作数的提升类型。
1 | 5 >> 32 == 5 |
JVM支持使用PrintAssembly选项来检查JIT编译器生成的代码。对了解代码是如何执行的,以及JIT编译器如何工作和优化代码有很大帮助。