助你加薪!2021年春招面向编程看这一篇就够了,让你面试无忧! (8)

finally两种执行情况:

//案例一 public class Demo1{ public static void main(String[] args){ Person p=haha(); System.out.println(p.age); //输出:28 } public static Person haha(){ Person p=new Person(); try{ p.age=18; return p; }catch(Exception e){ return null; }finally{ p.age=28; } } static class Person{ int age; } } //finally会再return 准备数据返回的阶段执行,所以,无论是否return,finally都是执行。 //案例二 public class Demo2{ public static void main(String[] args){ int a = haha(); System.out.println(a); //输出:10 } public static int haha(){ int a = 10; try{ return a; }catch(Exception e){ return null; }finally{ a = 20; } } } //结果和案例一不一样,是因为两者返回的数据类型不一样。 //案例一返回的是引用数据类型,在return的准备数据返回的阶段,备份的是堆内存地址,所以堆内存里的Person对象的age改变,return备份的值都会改变。 //案例二返回的是基本数据类型,在return的准备数据返回阶段,备份的是值,即10,所以无论栈内存中的a如何改变,都不会影响return备份的10。

案例一内存使用情况如下图所示:

助你加薪!2021年春招面向编程看这一篇就够了,让你面试无忧!

案例二内存使用情况如下图所示:

助你加薪!2021年春招面向编程看这一篇就够了,让你面试无忧!

异常体系结构

异常指的是Exception , Exception类, 在Java中存在一个父类Throwable(可能的抛出)

Throwable存在两个子类:

Error:表示的是错误,是JVM发出的错误操作,只能尽量避免,无法用代码处理。

Exception:一般表示所有程序中的错误,所以一般在程序中将进行try…catch的处理。

助你加薪!2021年春招面向编程看这一篇就够了,让你面试无忧!

受检异常代码会飘红,不受检异常不会。

多异常捕获的注意点:

1、 捕获更粗的异常不能放在捕获更细的异常之前。

2、 如果为了方便,则可以将所有的异常都使用Exception进行捕获。

特殊的多异常捕获写法:

catch(异常类型1 |异常类型2 对象名){ //表示此块用于处理异常类型1 和 异常类型2 的异常信息 } //还有可以直接使用Exception类捕获异常,这样所有的异常都能捕获,缺点是针对性差 throws关键字

在程序中异常的基本处理已经掌握了,但是随异常一起的还有一个称为throws关键字,此关键字主要在方法的声明上使用,表示方法中不处理异常,而交给调用处处理。

格式:

返回值 方法名称()throws Exception{ }

如果是传参导致的异常,应该通过throws将异常抛出去:

public class Demo{ public static void main(String[] args){ shutDown("0");//此处也是受检异常(飘红),因为shutDown()方法把异常抛给了调用者,所以需要捕获或者抛出异常。 } public static void shutDown(String text) throws IOException{ Runtime.getRuntime().exec(text);//此处为受检异常(飘红),需要捕获或者抛出异常 } //通俗点来讲,抛出异常就是告诉调用者,我这个方法有异常,你需要处理。 } throw关键字

throw关键字表示在程序中人为的抛出一个异常,因为从异常处理机制来看,所有的异常一旦产生之后,实际上抛出的就是一个异常类的实例化对象,那么此对象也可以由throw直接抛出。

代码:

throw new Exception("抛着玩的。") ;

示例:

public class Demo{ public static void main(String[] args){ Person person = new Person(); person.setAge(-1); } } class Person{ private int age; public void setAge(int age){ if(age<0 || age>180){ RuntimeException e = new RuntimeException("年龄不合理"); throw e; }else{ this.age = age; } } }

上述代码运行结果如下图所示:

助你加薪!2021年春招面向编程看这一篇就够了,让你面试无忧!

RuntimeExcepion与Exception的区别

注意观察如下方法的源码:

Integer类:

public static int parseInt(String text)throws NumberFormatException

此方法抛出了异常, 但是使用时却不需要进行try…catch捕获处理,原因:

因为NumberFormatException并不是Exception的直接子类,而是RuntimeException的子类,只要是RuntimeException的子类,则表示程序在操作的时候可以不必使用try…catch进行处理,如果有异常发生,则由JVM进行处理。当然,也可以通过try catch处理。

自定义异常类

编写一个类, 继承Exception,并重写一参构造方法 即可完成自定义受检异常类型。

编写一个类, 继承RuntimeException,并重写一参构造方法 即可完成自定义运行时异常类型。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwzyj.html