读过杨晓峰老师的36讲之后,想总结下自己的感想,写下来也有助于记忆,方便以后面试查阅和复习。题目所提到的话题本来是两讲,但是由于感想篇幅较短,所以合成一篇来写。
一、谈谈对Java平台的理解:
1、Java平台是一个面向对象编程的语言,具有封装、继承、多态三大特性。其最大的优点是"Write Once,Run Anywhere",即编写一次,到处运行,这句话的基础实际上是依靠Java通过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节。具体如何实现呢,或者说如何理解呢。众所周知,Java代码从编写到运行需要经过三个阶段。即代码编译为字节码,然后由JVM将字节码解释为机器码,机器码运行。之所以可以Run Anywhere,是因为JVM可以安装到不同的平台上,将编译好的.class文件(字节码)根据不同平台的实现解释为不同的机器码,实现跨平台。即Java语言的跨平台实际上指的是JVM跨平台,而不是语言本身。
2、有人说Java是解释性语言,这样说实际上是不准确的,因为在主流Java虚拟机如Oracle Hotspot 中,会提供JIT(juts-in-time)即“即时编译”。JIT会将热点代码直接编译为机器码,使得Java运行速度有显著提升。所以说Java是解释性语言其实是不准确的。
还需要了解的地方:AOT(Ahead-of-Time Compilation)、Class-Loader(类加载器)、JDK包含哪些工具等。
二、Exception和Error有什么区别。
1、Exception 和 Error 都继承了Throwable类,在Java中只有Throwable类的实例(包括子类实例)才可以被抛出(throw)或者捕获(catch)。Exception和Error都体现了Java设计者对不同异常情况的分类。
2、Error通常表示正常情况下不会出现的错误,或出现后很难由程序本身修复的错误,例如OOM(Out Of Memory Error)或者NoClassDefFoundError等
3、Exception又分为运行时异常和一般异常(文章中分为可检查异常和不检查异常,其本质是一样的)。运行时异常通常可以通过编码判断来避免的逻辑错误,如NullPointerException,ClassCastException等。而一般异常则是需要在编写代码时需要用try…catch…finally或throws捕获或抛出的异常。
4、捕获异常时需要注意几点,一个是尽量不要捕获类似于Exception这样的通用异常,否则有可能会把不想捕获的异常也捕获到例如本想捕获NoSuchMethodException,结果把NullPointerException也捕获到了,这样就无法判断到底是类对象为空还是没有这个方法,干扰问题的定位。第二个是不要使用e.printStackTrace();这样的代码,特别是在产品代码中,因为用这个方法最后异常堆栈轨迹是不知道打印到哪里去的。第三点则是Throw early,catch late原则,具体可以查看文章这里不再展开说。第四点,try…catch…finally块尽量只用来包裹需要抛出异常的那一句或者几句代码。有的时候程序员或许因为程序代码的可读性和美观性,将一大段代码用try…catch…finally包裹,实际上这样对性能的损耗是非常大的。
5、看到文中有提NoClassDefFoundError和ClassNotFoundException的区别,这里引用网上一篇文章《
怎么解决java.lang.NoClassDefFoundError错误》的一段话来解释
我们经常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError这两个错误迷惑不清,尽管他们都与Java classpath有关,但是他们完全不同。NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在J2EE的环境下工作,并且得到NoClassDefFoundError的异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。
最后举几个运行时异常和非运行时异常:
运行时异常:
ArithmeticException——由于除数为0引起的异常;
ArrayStoreException——由于数组存储空间不够引起的异常;
ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常;
IllegalMonitorStateException——监控器状态出错引起的异常;
NegativeArraySizeException—一数组长度是负数,则产生异常;
NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常;
OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空 间则产生异常;
SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常;
IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;
IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;
ClassNotFoundException——未找到指定名字的类或接口引起异常;
CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常;
InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从 而引起异常,有关线程的内容,将在下一章讲述;
NoSuchMethodException一所调用的方法未找到,引起异常;
Illega1AccessExcePtion—一试图访问一个非public方法;
StringIndexOutOfBoundsException——访问字符串序号越界,引起异常;
ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常;
NumberFormatException——字符的UTF代码数据格式有错引起异常;
IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常;
FileNotFoundException——未找到指定文件引起异常;
EOFException——未完成输入操作即遇文件结束引起异常。
引用于Java异常机制
一般异常:
ClassNotFoundException——常用与类反射,JVM反射时找不到所写的类,引起异常;
NoSuchMethodException——常用与类反射,JVM执行反射对象所得到的方法时找不到该方法,引起异常;
FileNotFoundException——常用于IO流操作,JVM读取文件流时找不到该文件,引起异常;
SQLException——当使用 JDBC 与数据源(在本文中的数据源表示我们实际使用的数据库)进行交互的时候遇见错误的时候,将会抛出名为 SQLException 的异常。
感谢@笃志近思、@jamesjxin 两位博主的分享和帮助,感谢杨晓峰老师,感谢帮助我的人。
此文章仅为个人浅见,不喜勿喷,欢迎各位大大带着批判的眼光和友好的语言提出建议和不足。
文章原创,转载请留言