本文共 6618 字,大约阅读时间需要 22 分钟。
目录介绍
- 10.0.0.1 见过哪些运行时异常?异常处理机制知道哪些?从异常是否必须需要被处理的角度来看怎么分类?
- 10.0.0.2 运用Java异常处理机制?异常处理的原理?Java中检查异常和非检查异常的区别?
- 10.0.0.3 异常处理的过程中,你遵循那些好的实践? throw 和 throws这两个关键字在java中有什么不同?
- 10.0.0.4 你知道什么是“异常链”吗?自定义实现过哪些异常,怎么写的?可以有一个空的catch块吗?
- 10.0.0.5 Java异常类有哪些的重要方法?导致“主线程中的异常”的不同场景是什么?
- 10.0.0.6 看下面这段子类继承父类代码有什么问题?针对抛异常是IOException还是Exception,能随便写吗,结合案例说一下?
- 10.0.0.7 捕获异常时,为何在catch中要注意异常层级关系?需要注意哪些问题?
好消息
- 博客笔记大汇总【15年10月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计500篇[近100万字],将会陆续发表到网上,转载请注明出处,谢谢!
- 链接地址:
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!所有博客将陆续开源到GitHub!
10.0.0.1 见过哪些运行时异常?异常处理机制知道哪些?从异常是否必须需要被处理的角度来看怎么分类?
10.0.0.2 运用Java异常处理机制? 异常处理的原理?Java中检查异常和非检查异常的区别?
-
运用Java异常处理机制?
- 1.try…catch语句
- 2.finally语句:大多数情况下都必须执行的代码
- 3.throws子句:声明可能发生的异常类
- 4.throw:抛出具体的异常对象。
-
异常处理的原理?
- Java虚拟机用方法调用栈(method invocation stack)来跟踪每个线程中一系列的方法调用过程。如果在执行方法过程中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块。当Java虚拟机追溯到调用栈的底部的方法的时候,如果仍然没有找到处理该异常的代码块,这样它就会按步骤处理,首先会打印方法调用栈的异常信息,然后如果所处的线程不是主线程,那么就会终止这个线程。
-
Java中检查异常和非检查异常的区别
10.0.0.3 异常处理的过程中,你遵循那些好的实践? throw 和 throws这两个关键字在java中有什么不同?
10.0.0.4 你知道什么是“异常链”吗?自定义实现过哪些异常,怎么写的?可以有一个空的catch块吗?
-
你知道什么是“异常链”吗?
- “异常链”是Java中非常流行的异常处理概念,是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条。该技术大多用于将“ 受检查异常” ( checked exception)封装成为“非受检查异常”(unchecked exception)或者RuntimeException。顺便说一下,如果因为因为异常你决定抛出一个新的异常,你一定要包含原有的异常,这样,处理程序才可以通过getCause()和initCause()方法来访问异常最终的根源。
- 自定义实现过哪些异常?
-
可以有一个空的catch块吗?
- 可以有一个空的catch块,但这是最糟糕的编程的例子。不应该有空的catch块,因为如果异常被该块捕获,我们将没有关于异常的信息,它将成为调试它的噩梦。应该至少有一个日志记录语句来记录控制台或日志文件中的异常详细信息。
10.0.0.5 Java异常类有哪些的重要方法?导致“主线程中的异常”的不同场景是什么?
-
Java异常类有哪些的重要方法?
-
导致“主线程中的异常”的不同场景是什么?
-
一些常见的主线程异常情况是:
- 线程main java.lang.UnsupportedClassVersionError中的异常:当您的java类从另一个JDK版本编译并且您试图从另一个java版本运行它时,会出现此异常。
- 线程main java.lang.NoClassDefFoundError中的异常 :此异常有两种变体。 第一个是你提供扩展名为.class的类全名的地方。 第二种情况是没有找到类。
- 线程main java.lang.NoSuchMethodError中的异常:main :当您尝试运行一个没有main方法的类时,会出现此异常。
- 线程“main”中的异常java.lang.ArithmeticException :无论何时从main方法抛出任何异常,它都会打印出异常是console。 第一部分解释了异常从main方法抛出,第二部分打印异常类名称,然后在冒号后打印异常消息。
10.0.0.6 看下面这段子类继承父类代码有什么问题?针对抛异常是IOException还是Exception,能随便写吗,结合案例说一下?
-
看下面这段代码有什么问题?
public class SuperClass { public void start() throws IOException{ throw new IOException("Not able to open file"); }} public class SubClass extends SuperClass{ public void start() throws Exception{ throw new Exception("Not able to start"); }}
- 这段代码编译器将对子类覆盖start方法产生错误。因为每个Java中方法的覆盖是有规则的,一个覆盖的方法不能抛出的异常比原方法继承关系高。因为这里的start方法在超类中抛出了IOException,所有在子类中的start方法只能抛出要么是IOExcepition或是其子类,但不能是其超类,如Exception。
-
针对抛异常是IOException还是Exception,能随便写吗,结合案例说一下?
- 肯定不要随便写,容易造成迷惑性。下面看看代码,举个简单的案例!
public static void start(){ System.out.println("Java Exception");} public static void main(String args[]) { try{ start(); }catch(IOException e){ e.printStackTrace(); }}
- 上面的Java异常例子代码中,编译器将在处理IOException时报错,因为IOException是受检查异常,而start方法并没有抛出IOException,所以编译器将抛出“异常,java.io.IOException不会在try语句体中抛出”,但是如果你将IOException改为Exception,编译器报错将消失,因为Exception可以用来捕捉所有运行时异常,这样就不需要声明抛出语句。我喜欢这样带有迷惑性的Java异常面试题,因为它不会让人轻易的找出是IOException还是Exception。你也可以在JoshuaBloach和NeilGafter的Java谜题中找到一些有关Java错误和异常的具有迷惑性问题。
10.0.0.7 捕获异常时,为何在catch中要注意异常层级关系?需要注意哪些问题?
-
捕获异常时,为何在catch中要注意异常层级关系?需要注意哪些问题?
- 注意,catch中一定要注意层级关系。这里举一个简单的案例,就可以很好的理解为何要注重层级问题呢!
public static void start() throws IOException, RuntimeException{ throw new RuntimeException("Not able to Start");}public static void main(String args[]) { try { start(); } catch (Exception e) { e.printStackTrace(); } catch (RuntimeException e2) { e2.printStackTrace(); }}
- 这段代码会在捕捉异常代码块的RuntimeException类型变量“e2”里抛出编译异常错误。因为Exception是RuntimeException的超类,在start方法中所有的RuntimeException会被第一个捕捉异常块捕捉,这样就无法到达第二个捕捉块,这就是抛出“exception java.lang.RuntimeException has already been caught”的编译错误原因。
其他介绍
01.关于博客汇总链接
02.关于我的博客
- 我的个人站点:www.yczbj.org,www.ycbjie.cn
- github:
- 知乎:
- 简书:
- csdn:
- 喜马拉雅听书:
- 开源中国:
- 泡在网上的日子:
- 邮箱:yangchong211@163.com
- 阿里云博客: 239.headeruserinfo.3.dT4bcV
- segmentfault头条:
- 掘金: