二分查找和异常
- 1.二分查找法取中间值:建议low+(high-low)/2而不是(high+low)/2?
- 2.三种异常,和后续代码能否执行。
- 3.除了Error与RuntimeException为非检查异常,其他异常都为检查异常,最大化地使用java编译器的功能,节省jvm资源。
- 4.JVM 是如何处理异常的?
- 5.自己new异常和jvm new异常有什么区别?
- 6.throw和throws关键字的作用区别?
- 7.throws一般要和throw配合使用。
- 8.尽量不要使用throws抛异常?
- 9.添加try catch快捷键,ctrl +alt +t
- 10.代码即使没有抛出异常,也可以使用try....catch。
- 11.Objects类中requireNonNull方法,判断是不是为空(了解) 。
- 12.打印异常,最好在日志上打印。
- 13.finally主要用于资源释放。
- 14.只有try..finally:没有catch的时候,后面的代码不会被执行。
- 15.try可以单独使用嘛?不可以!
- 16.finally内有异常,可以在finally内再次try..catch。
- 17.父类方法没有抛出异常,子类重写该方法时就不能声明抛出,只能捕获。
- 18.工作中,子类方法还是跟父类抛出的方法保持一致就行了。
- 19.异常只要抛出,才需要处理,不抛就可以不处理。
- 20.子类重写父类方法时抛出的异常不能大于父类异常。
- 21.一次捕获多次处理时(工作中常用),注意:子类异常要写在父类异常前面。
- 22.如果创建的是编译器异常,必须要处理,抛出或catch,运行期异常就不用管了,自己会抛给Jvm处理。
- 23.想不终止程序就用try..catch。
- 24.idea查找替换快捷键。
- 25.光标快速移动到下一个词汇。
- 25.如果throw了一个运行期异常,那么可以不用throws声明抛出异常。
1.二分查找法取中间值:建议low+(high-low)/2而不是(high+low)/2?
因为当high和low都是很大的int时,high+low的值可能大于Integer.maxValue,导致溢出。
2.三种异常,和后续代码能否执行。
编译期异常,被解决了的话,才可以进行编译为class文件
运行期异常,被解决了的话,不影响后面的代码执行
错误,解决不了,必须修改代码。
3.除了Error与RuntimeException为非检查异常,其他异常都为检查异常,最大化地使用java编译器的功能,节省jvm资源。
在java中创建异常实例的代价特别大。当构建异常实例的时候,java虚拟机需要为异常实例构建一个栈轨迹。需要记录很多调试信息:包括栈帧所指向方法的名字、方法所在的类、第几行抛出的异常。(e.printStackTrace();打印的就是这些部分信息)
4.JVM 是如何处理异常的?
在一个方法中如果发生异常,这个方法会创建一个异常对象(jvm自己创建异常对象),并转交给 JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给 JVM 的过程称为抛出异常。可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。
JVM 会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。当 JVM 发现可以处理异常的代码时,会把发生的异常传递给它。如果 JVM 没有找到可以处理该异常的代码块,JVM 就会将该异常转交给默认的异常处理器(默认处理器为 JVM 的一部分),默认异常处理器打印出异常信息并终止应用程序。
5.自己new异常和jvm new异常有什么区别?
作用,自己定义指定的异常。
可以自己定义指定的异常:判断可能出现异常,throw,自己new异常类,抛出去,就不用jvm自己new了
6.throw和throws关键字的作用区别?
1)throw关键字作用
throw:在方法中主动的抛出指定的异常(想抛什么对象就抛什么对象)
2)throws关键字作用
throws:把方法内部创建的异常对象抛出别人(调用者)去处理(甩锅)
7.throws一般要和throw配合使用。
throw new异常对象,throws是向调用者抛出(甩锅)和声明作用。
比如,代码里有编译器期异常,不想try catche,就可以throws。
8.尽量不要使用throws抛异常?
因为方法里只要抛出异常,方法内的后续代码就不会执行。
9.添加try catch快捷键,ctrl +alt +t
10.代码即使没有抛出异常,也可以使用try…catch。
11.Objects类中requireNonNull方法,判断是不是为空(了解) 。
requireNonNull:判断传递的对象是否为null
如果传递的对象是null,方法内部就会抛出空指针异常
如果传递的对象不是null,则方法内部返回这个对象
Throwable类中定义的异常处理逻辑(了解) 15最后一点再听一下
12.打印异常,最好在日志上打印。
最好使用logger.error(e.getMessage(),e)方法来在日志上查看异常的详细结果
13.finally主要用于资源释放。
14.只有try…finally:没有catch的时候,后面的代码不会被执行。
所以finally和普通代码还是有很大区别的(无论catch不catch都可以运行,会在jvm中断处理之前执行)。
15.try可以单独使用嘛?不可以!
1)编译器定下的规矩(语法)
编译器定下的规矩,就是try后必须要有catch或finally,不能只出现一个try,而没有catch或者finally。你不这么做,编译器就不把你的.java文件转化为.class文件。
2)设计java语言的意图(语义)
try的意思是,接下来的代码可能会抛出异常,既然你已经表明你的意图了,那你不是该为你的意图做一些工作?有异常,你是不是该处理?怎么处理?用catch和finally。如果你不写catch和finally,那意思就是: 我知道这代码可能有异常,但是我就不处理,这不是流氓嘛,不符合逻辑。
16.finally内有异常,可以在finally内再次try…catch。
17.父类方法没有抛出异常,子类重写该方法时就不能声明抛出,只能捕获。
18.工作中,子类方法还是跟父类抛出的方法保持一致就行了。
19.异常只要抛出,才需要处理,不抛就可以不处理。
20.子类重写父类方法时抛出的异常不能大于父类异常。
原因分析:
1、在java多态机制中,对象引用fs在编译时期是属于父类类型也即Father类型,但是在运行时fs属于子类类型,也就是Son类型
2、也就是说在编译的时候,编译器发现catch中的IOException完全能将父类方法中抛出的异常捕获,因此编译通过,但是在运 行时期,由于fs变成了子类类型,子类重写的方法抛出的异常是Exception,显然IOException不能捕获这个比它更大的异 常,因此在运行时期也就出现失败
总结:这个示例也就演示了一个道理,在java中,子类重写父类的方法时,子类如果选择抛出异常,那么抛出的异常类型不能大于父类的异常类型
21.一次捕获多次处理时(工作中常用),注意:子类异常要写在父类异常前面。
catch中是顺序执行的,所以catch父类的异常,不能写在catch子类异常前面。不然子类异常的catch永远不会被调用
22.如果创建的是编译器异常,必须要处理,抛出或catch,运行期异常就不用管了,自己会抛给Jvm处理。
23.想不终止程序就用try…catch。
24.idea查找替换快捷键。
查找 ctrl+f
替换 ctrl+r