文章目录
1、try{} 里有一个 return语句,那么紧跟在这个try 后的 finally{}里的代码会不会执行,什么时候执行,在 return 前还是后?
会执行,在方法返回调用者前执行。
注意:
在 finally 中改变返回值的做法是不好的,因为如果存在 finally 代码块,try 中的return 语句不会立马返回调用者,而是记录下返回值待 finally 代码块执行完毕之后再向调用者返回其值,然后如果在 finally 中修改了 返回值,就会返回修改后的值。显然,在 finally 中返回或者修改返回值会对程序造成很大的困扰,C# 中直接用编译错误的方式来阻止程序员干这种龌龊的事情, Java 中 也可以通过[提升编译器的语法检查级别]((3条消息) 新版IDEA 右下角没有小人头,增修改语法检查级别_半路出家的小王的博客-CSDN博客_idea右下角的小人有什么用)来产生警告或错误。
2、 Java 语言如何进行异常处理,关键字: throws、throw、try、catch、finally 分别如何使用?
Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。 在 Java中,每个异常都是一个对象,它是 Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。 Java 的异常处理是通过 5 个关键词来实现的: try 、 catch、throw、throws 和 finally。一般情况下是用 try 来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理; try 用来指定一块预防所有异常的程序;catch 子句紧跟在 try 块后面,用来指定你想要捕获的异常的类型; throw 语句用来明确地抛出一个异常;throws 用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally 为确保一段代码不管发生什么异常状况都要被执行;try 语句可以嵌套,每当遇到一个try 语句,异常的结构就会被放入异常栈中,直到所有的 try 语句都完成。如果下一级的 try 语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常 的 try语句或者最终将异常抛给 JVM。
3、运行时异常与受检异常有何不同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。
受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java 编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一样,是面向对象程序设计中经常被滥用的东西,在 Effective Java 中对异常的使用给出了以下指导原则:
- 不要将异常处理用于正常的控制流(设计良好的 API 不应该强迫它的调用者为了正常的控制流而使用异常)
- 对可以恢复的情况使用受检异常,对编程错误使用运行时异常
- 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)
- 优先使用标准的异常
- 每个方法抛出的异常都要有文档
- 保持异常的原子性
- 不要在 catch 中忽略掉捕获到的异常
4、列出一些你常见的运行时异常?
- ArithmeticException(算术异常)
- ClassCastException(类转换异常)
- illegalArgumentException(非法参数异常)
- IndexOutOfBoundsExc(下标越界异常)
- NullPointException(空指针异常)
- SecurityException(安全异常)
5、阐述 final、finally、finalize 的区别。
- final:修饰符(关键字)有三种用法:如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。 将变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须在声明时给它定初值,而以后的引用中只能读取不可修改。被声明为 final 的方法也同样只能使用,不能在子类中被重写。
- finally:通常放在 try…catch… 的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在 finally 块中。
- finalize: Object 类中定义的方法, Java 中允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写 finalize() 方法可以整理系统资源或者执行其他清理工作。