【第二章:Java核心技术解析】第5节:Java基础 - 必知必会(下)


大家好,很高兴我们可以继续学习交流Java高频面试题。本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点。熟练掌握本小节的知识点,可以帮助大家更好的复习与掌握Java面试中的基础类题目,对我们的实际开发也会有很大的帮助。


(1)Java中的Exception和Error有什么区别?

答: Exception和Error的主要区别可以概括如下。

  • Exception是程序正常运行中预料到可能会出现的错误,并且应该被捕获并进行相应的处理,是一种异常现象
  • Error是正常情况下不可能发生的错误,Error会导致JVM处于一种不可恢复的状态,不需要捕获处理,比如说OutOfMemoryError

解析:

Exception又分为了运行时异常和编译时异常

编译时异常(受检异常)表示当前调用的方法体内部抛出了一个异常,所以编译器检测到这段代码在运行时可能会出异常,所以要求我们必须对异常进行相应的处理,可以捕获异常或者抛给上层调用方。

运行时异常(非受检异常)表示在运行时出现的异常,常见的运行时异常包括:空指针异常,数组越界异常,数字转换异常以及算术异常等。

前边说到了异常Exception应该被捕获,我们可以使用try – catch – finally 来处理异常,并且使得程序恢复正常。

那么我们捕获异常应该遵循哪些原则呢?

  • 尽可能捕获比较详细的异常,而不是使用Exception一起捕获。
  • 当本模块不知道捕获之后该怎么处理异常时,可以将其抛给上层模块。上层模块拥有更多的业务逻辑,可以进行更好的处理。
  • 捕获异常后至少应该有日志记录,方便之后的排查。
  • 不要使用一个很大的try – catch包住整段代码,不利于问题的排查。

这些都是笔者血淋淋的教训,捕获到异常,却看不出是哪里抛出的,这才是绝望。然后,我们再来看一个容易混淆的异常与错误知识点:

NoClassDefFoundError 和 ClassNotFoundException 有什么区别?

答:从名字中,我们可以看出前者是一个错误,后者是一个异常。我们先来看下JDK中对ClassNotFoundException异常的阐述:

图片说明

大概意思就是在说,当我们使用例如Class.forName方法来动态的加载该类的时候,传入了一个类名,但是其并没有在类路径中被找到的时候,就会报ClassNotFoundException异常。出现这种情况,一般都是类名字传入有误导致的。

我们再来看下JDK中对该错误NoClassDefFoundError的阐述:

图片说明

大概意思是这样的,如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。但是要查找的类在编译的时候是存在的,运行的时候却找不到了。这个时候就会导致NoClassDefFoundError。出现这种情况,一般是由于打包的时候漏掉了部分类或者Jar包被篡改已经损坏。


(2)JIT编译器有了解吗?

答:前面我们谈到了Java是一种先编译,后解释执行的语言。那么我们就来说下何为JIT编译器吧。

JIT编译器全名叫Just In Time Compile 也就是即时编译器,把经常运行的代码作为"热点代码"编译成与本地平台相关的机器码,并进行各种层次的优化。JIT编译除了具有缓存的功能外,还会对代码做各种优化,包括逃逸分析、锁消除、 锁膨胀、方法内联、空值检查消除、类型检测消除以及公共子表达式消除等。

解析:
JIT编译器属于Java基础中的比较有深度的题目了,回答出来算是一个亮点了。既然说到了JIT编译器,我们来看下JIT对代码优化使用到的逃逸分析技术吧。

逃逸分析:

逃逸分析的基本行为就是分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。JIT编译器的优化包括如下:

  • 同布省略:也就是锁消除,当JIT编译器判断不会产生并发问题,那么会将同步synchronized去掉
  • 标量替换

我们先来解释下标量和聚合量的基本概念。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java开发岗高频面试题全解析 文章被收录于专栏

<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

全部评论
个人整理的补充面试题目,嫌麻烦的同学可以看一下。https://blog.csdn.net/dllmha/article/details/106522578 
7 回复 分享
发布于 2020-06-11 19:48
Meloddy同学的总结很棒,除了第一个StringBuffer和StringBuilder。StringBuffer是线程安全的,可以按照safe后缀fe来记忆哪个是线程安全的。
7 回复 分享
发布于 2020-01-03 22:43
4.hashcode方法存在主要是提高判断对象是否相等的效率,当对象equals相等时,它们的hashcode一定相等,但是当对象的hashcode相等时,两个对象不一定是相等的。再比较对象是否相等时,先比较通过hashcode进行比较,然后进行equals比较。(仅供参考,欢迎补充)
6 回复 分享
发布于 2020-01-03 18:54
剩下的应该只有Hello了
4 回复 分享
发布于 2019-11-26 20:51
7.Java中==用于比较Java对象的引用是否相同,equals则是用于比较Java对象的内容是否相同
2 回复 分享
发布于 2020-01-03 19:23
3.将对象转换为字节序列存储到硬盘上的过程叫做对象的序列化;反序列化则是把硬盘上的字节序列读取恢复成一个对象的过程
2 回复 分享
发布于 2020-01-03 18:46
所以Java中是只有值传递了
2 回复 分享
发布于 2019-12-03 20:06
其余经典面试题也可以给下答案吗?谢谢
2 回复 分享
发布于 2019-12-01 18:48
我记得Java只有值传递吧,对于基本数据类型,是对值拷贝后进行传递,对于引用数据类型,是对对象的引用进行拷贝进行传递,求解释
1 回复 分享
发布于 2021-01-31 22:38
如果两个对象相等(equal),它们的hashcode一定相同; 如果两个对象有相同的hashcode,它们不一定相等(equal);
1 回复 分享
发布于 2020-05-28 11:17
有个错别字:逃逸分析的优化应该是同”步“省略,而非同布省略
1 回复 分享
发布于 2020-05-13 08:33
建议还是把剩下的有关内容一次性更新了吧……要不然还要四处翻,挺麻烦的。
1 回复 分享
发布于 2020-04-11 11:28
思考题都是hello,因为changeDate没有返回值
1 回复 分享
发布于 2020-02-29 14:52
StringBuilder线程不安全,效率高(一般使用它) StringBuffer线程安全,效率低 因为String类的字符串初始化后是不能够改变其中的字符的,所以要使用StringBuilder和StringBuffer。 当要往string数组后加内容时,避免使用String类
1 回复 分享
发布于 2020-02-22 16:40
static, final, finalize这些好像没有提及? 作者可不可以把其他常见的题目列一个目录出来以求全?
1 回复 分享
发布于 2020-02-15 16:22
6.静态所修饰的在类中是唯一的,static可以修饰成员变量、方法、代码块,从内存角度来看,静态成员变量存放在常量池中,并且是在该类在加载时就会被放入常量池,而非静态成员变量是存放在堆中,局部变量存放在栈中;从运行时期来看,在代码被编译成.class文件时,由static修饰的代码块、成员变量、方***被放入内存的方法区中,如果在静态方法中调用了非静态的成员变量、局部变量或是非静态的方法,则会出现错误。(仅供参考,欢迎补充)
1 回复 分享
发布于 2020-01-03 19:16
5.Java和C++的区别主要在于,Java是一门面向对象的编程语言,C++是一门面向过程的编程语言。举个例子:你现在需要一辆汽车,Java的操作应该是将现成的轮子,发动机,车门,车的框架等各个组件如何组装起来;C++的操作则更像,首先,你需要造一个轮子,然后造车门,然后造发动机等这样的操作流程。Java面向对象编程的思想具有低耦合的性质,但是效率上是不如C++的。还有一点,Java的GC是程序员的福音,不需要程序员手动的清除无用对象。(仅供参考,欢迎补充)
1 回复 分享
发布于 2020-01-03 19:02
1.StringBuffer和StringBuilder的区别主要是一个是线程安全,一个非线程安全;其中StringBuffer属于非线程安全,StringBuilder属于线程安全,并且StringBuffer的运行效率要比StringBuilder的运行效率要高
1 回复 分享
发布于 2020-01-03 18:40
D:\JAVA\bin\java.exe -javaagent:D:\IDEA2018\ideaIU-2018.3.5.win\lib\idea_rt.jar=63045:D:\IDEA2018\ideaIU-2018.3.5.win\bin -Dfile.encoding=UTF-8 -classpath D:\JAVA\jre\lib\charsets.jar;D:\JAVA\jre\lib\deploy.jar;D:\JAVA\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jre\lib\ext\cldrdata.jar;D:\JAVA\jre\lib\ext\dnsns.jar;D:\JAVA\jre\lib\ext\jaccess.jar;D:\JAVA\jre\lib\ext\jfxrt.jar;D:\JAVA\jre\lib\ext\localedata.jar;D:\JAVA\jre\lib\ext\nashorn.jar;D:\JAVA\jre\lib\ext\sunec.jar;D:\JAVA\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jre\lib\ext\sunmscapi.jar;D:\JAVA\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jre\lib\ext\zipfs.jar;D:\JAVA\jre\lib\javaws.jar;D:\JAVA\jre\lib\jce.jar;D:\JAVA\jre\lib\jfr.jar;D:\JAVA\jre\lib\jfxswt.jar;D:\JAVA\jre\lib\jsse.jar;D:\JAVA\jre\lib\management-agent.jar;D:\JAVA\jre\lib\plugin.jar;D:\JAVA\jre\lib\resources.jar;D:\JAVA\jre\lib\rt.jar;F:\DSA\out\production\DSA com.bjsxt.test09.Test Before change, sb = Hello After change, sb = Hello Process finished with exit code 0
1 回复 分享
发布于 2019-12-28 09:45
特别是泛型
1 回复 分享
发布于 2019-12-01 18:48

相关推荐

刷到其他牛友的面经,这是什么面试题&nbsp;咋还问这个
爱睡觉的冰箱哥:问出这种问题的公司有人去的是这个
点赞 评论 收藏
分享
点赞 评论 收藏
分享
嵐jlu:我是山川🐔里🐔🧱的,阿里系简历全过; 你这简历一看就还是半成品啊,没有荣誉经历奖项什么的吗?
投递阿里巴巴集团等公司8个岗位
点赞 评论 收藏
分享
评论
10
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务