(二分查找和异常)day10javaSE基础查漏补缺

二分查找和异常

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

25.光标快速移动到下一个词汇。

在这里插入图片描述

25.如果throw了一个运行期异常,那么可以不用throws声明抛出异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值