最近在学Java基础,遇到一些知识点,以前不知道的,做个笔记。温故知新。
1、Java是解释运行吗?
我们常说,Java是解释型语音,那么,说它是解释运行,对不对?其实不对。
(1)Java源代码经过Javac编译成 .class文件
(2).class文件经过JVM解释或编译运行
解释:.class文件经过JVM内嵌的解释器解析执行
编译:存在JIT编译器,会把经常运行的代码作为“热点代码”编译与本地平台相关的机器码,并进行各种层次的优化
2、解释执行和编译执行有何区别——类比一下,一个是同声传译,一个是放录音
3、Error:总是不可控制的(unchecked);经常用来用于表示系统错误或低层资源的错误
4、Exception:分为可检查异常和不检查异常
可检查异常:在源代码里必须显示的进行捕获处理,这是编译期检查的一部分
最常见的就是File和Json解析的时候,如果不进行对应的 try…catch处理,代码就会直接报错。
不检查异常:就是所谓的运行时异常,我们写了代码,就算有错,代码也不会检查,只有真正的运行起来,用到了,才会出现。如:NullPointerException、IndexOutOfBoundsException
示例代码:
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("111");
arrayList.add("222");
arrayList.add("333");
Log.e("demo", arrayList.get(8));
写这段代码,有明显错误,但是代码上没有任何提示,只有真的运行起来,才会报异常:
java.lang.IndexOutOfBoundsException: Invalid index 8, size is 3
5、有了异常,肯定就需要try…catch了。这里着重说一下finally。
在我们的认知中,有2个“常识”:1、遇到return,后面的代码不会执行;2、try…catch中的finally,是一定会走到的。那么,这2个情况在一起,会怎么样?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("getReturnCode", getReturnCode());
}
private String getReturnCode() {
try {
return "100";
} catch (Exception e) {
return "200";
} finally {
return "300";
}
}
日志打印了:
07-23 11:08:35.678 21337-21337/com.chen.demo E/getReturnCode: 300
很明显,就算try中return了,finally,依旧会走到。不会存在“停止”
那么,是不是意味着:不管try中做什么,finally,一定会执行?
不对。一定的情况下,finally也不会走到。finally再厉害,也得在线程中执行,如果,我们可以在try中就关闭线程呢?
如下:
try {
/**
* 0:正常退出,程序正常执行结束退出
* 1:是非正常退出,就是说无论程序正在执行与否,都退出
*/
Log.e("demo", "try==01");
System.exit(0);
Log.e("demo", "try==02");
} finally {
Log.e("demo", "finally");
}
运行后,日志是:
07-23 11:14:17.810 22495-22495/com.chen.demo E/demo: try==01
这样,finally就不会走到了。
不管上面代码中的System.exit中传0还是1,结果都一样。