10.Java异常问题
private static voidshow() { throw new UnsupportedOperationException(“抛出异常”);}
10.0.0.4 你知道什么是“异常链”吗?自定义实现过哪些异常,怎么写的?可以有一个空的catch块吗?你知道什么是“异常链”吗?“异常链”是Java中非常流行的异常处理概念,是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条。该技术大多用于将“ 受检查异常” ( checked exception)封装成为“非受检查异常”(unchecked exception)或者RuntimeException。顺便说一下,如果因为因为异常你决定抛出一个新的异常,你一定要包含原有的异常,这样,处理程序才可以通过getCause()和initCause()方法来访问异常最终的根源。自定义实现过哪些异常?可以有一个空的catch块吗?可以有一个空的catch块,但这是最糟糕的编程的例子。不应该有空的catch块,因为如果异常被该块捕获,我们将没有关于异常的信息,它将成为调试它的噩梦。应该至少有一个日志记录语句来记录控制台或日志文件中的异常详细信息。技术博客大总结10.0.0.5 Java异常类有哪些的重要方法?导致“主线程中的异常”的不同场景是什么?Java异常类有哪些的重要方法?Exception和它的所有子类没有提供任何特殊方法供使用,它们的所有方法都是来自其基类Throwable。String getMessage():方法返回Throwable的String型信息,当异常通过构造器创建后可用。String getLocalizedMessage():此方法通过被重写来得到用本地语言表示的异常信息返回给调用程序。Throwable类通常只是用getMessage()方法来实现返回异常信息。synchronized Throwable getCause():此方法返回异常产生的原因,如果不知道原因的话返回null。(原文有拼写错误 应该是if 不是id)String toString():方法返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息。void printStackTrace():该方法打印栈轨迹信息到标准错误流。该方法能接受PrintStream 和PrintWriter作为参数实现重载,这样就能实现打印栈轨迹到文件或流中。导致“主线程中的异常”的不同场景是什么?一些常见的主线程异常情况是:线程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.关于博客汇总链接1.技术博客汇总2.开源项目汇总3.生活博客汇总4.喜马拉雅音频汇总5.其他汇总02.关于我的博客我的个人站点:www.yczbj.org,www.ycbjie.cngithub:https://github.com/yangchong211知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts简书:http://www.jianshu.com/u/b7b2c6ed9284csdn:http://my.csdn.net/m0_37700275喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/开源中国:https://my.oschina.net/zbj1618/blog泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1邮箱:yangchong211@163.com阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcVsegmentfault头条:https://segmentfault.com/u/xiangjianyu/articles掘金:https://juejin.im/user/5939433efe88c2006afa0c6e
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。