博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读Java核心技术36讲有感——谈谈对Java的理解,谈谈Exception和Error
阅读量:4290 次
发布时间:2019-05-27

本文共 3345 字,大约阅读时间需要 11 分钟。

读过杨晓峰老师的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.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——未完成输入操作即遇文件结束引起异常。

引用于


一般异常:

ClassNotFoundException——常用与类反射,JVM反射时找不到所写的类,引起异常;
NoSuchMethodException——常用与类反射,JVM执行反射对象所得到的方法时找不到该方法,引起异常;
FileNotFoundException——常用于IO流操作,JVM读取文件流时找不到该文件,引起异常;
SQLException——当使用 JDBC 与数据源(在本文中的数据源表示我们实际使用的数据库)进行交互的时候遇见错误的时候,将会抛出名为 SQLException 的异常。

感谢@笃志近思、@jamesjxin 两位博主的分享和帮助,感谢杨晓峰老师,感谢帮助我的人。

此文章仅为个人浅见,不喜勿喷,欢迎各位大大带着批判的眼光和友好的语言提出建议和不足。

文章原创,转载请留言

你可能感兴趣的文章
互联网30年,泡沫如梦,一个个泡沫和风口过后,会是什么样的结局
查看>>
升级centos 6.8 服务器的gcc
查看>>
API网关在微服务架构中的应用,这一篇就够了
查看>>
JVM发生内存溢出的8种原因、及解决办法
查看>>
SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作
查看>>
高性能负载均衡:nginx搭建tomcat集群
查看>>
Spring切面中的正则表达式
查看>>
一直再说高并发,多少QPS才算高并发?
查看>>
Git恢复之前版本的两种方法reset、revert(图文详解)
查看>>
Maven打包的三种方式
查看>>
电商场景:并发扣库存,怎么保证不超卖又不影响并发性能
查看>>
分布式事务处理方式总结
查看>>
延迟队列有哪些实现方案?说说你的看法
查看>>
厉害了!我们老大半小时把我的springboot项目并发提升几倍
查看>>
Spring 中Bean 的生命周期
查看>>
为什么要用枚举实现单例模式(避免反射、序列化问题)
查看>>
微服务架构下的分布式限流方案思考
查看>>
全网最详细的一篇SpringCloud总结
查看>>
消息中间件中的有序消息,其实是排队但是不能插队
查看>>
mysql为什么使用B+树作为索引的结构
查看>>