开发者社区> yichudu> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Exception 异常

简介: java.lang.Throwable是所有错误和异常的父类。只有它(或它的子类)的实例才可以被JVM抛出。 Throwable对象派生出两种类型:Error和Exception,前者用来表示编译时和系统错误,程序员往往不必关心;后者是可以被抛出的基本类型,需要程序员关注。 1.try与catch try{ //code that might generate exceptio
+关注继续查看
java.lang.Throwable

是所有错误和异常的父类。只有它(或它的子类)的实例才可以被JVM抛出。

Throwable对象派生出两种类型:ErrorException,前者用来表示编译时和系统错误,程序员往往不必关心;后者是可以被抛出的基本类型,需要程序员关注。

1.try与catch

try{
	//code that might generate exceptions
}catch(Type1 id1){
	//Handle exception of Type1
}catch(Type2 id2){
	//Handle exception of Type2
}catch(Type3 id3){
	//Handle exception of Type3
}
// etc ...


注意:只有得到匹配的catch子句才能得到执行,这与case语句不同。switch语句需要在每一个case子句之后跟一个break,以避免执行后续的case子句。
可以自定义异常类来表示自己程序中的特定异常。要自己定义异常类,必须从已有的异常类继承。对于异常来说,最重要的就是类名,所以起一个好的名字,类内为空也行。
printStackTrace()方法。它将打印 从方法调用处,知道异常抛出处 的方法调用栈。
可以通过语句 catch(Exception e){}捕获所有的异常,所以最好把它放在所有捕获的末尾,以防它 抢在其他处理程序之前 先把异常捕获了。
异常捕获后也可以再把它重新抛出。

public class A {
	public static void main(String[] args) {
		try {
			fun();
			System.out.println(1);//若上句发生异常,此句将得不到执行,符合预期。
		} catch (Exception e) {
			System.out.println(2);
		}
	}
	static void fun() throws NullPointerException {
		throw new NullPointerException();
	}
}
/*2*/


2.finally

对于一些代码A,可能希望 无论try{} 中是否发生了异常,A都能得到执行,此时可在异常处理后面加上finally{}语句块。

finally{}中不要写return,IDE会有警告,这样的写法不合理。

注意:若一个函数中return语句在finally语句前面,finally仍能得到执行。

有时可以见到这样的写法,try{} finally{},不要catch{}。这种写法也是可以的,编译器不会报错。效果是发生异常照样抛出,但finally{}照样执行。

3.执行顺序

try{ line1; line 2;}中有多行代码,若line1抛出了异常,则line2得不到执行。
catch(Exception e){}若得到命中,则执行完后,它后面的正常代码也能得到执行。

检查型/非检查型 异常

Java的异常(Exception)按照编译器检查方式又可以分为检查型异常(CheckedException)和非检查型异常(UncheckedException)。
在Java中所有不是RuntimeException派生的Exception都是检查型异常。当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含throws语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明throws语句。 检查型异常是JAVA首创的,在编译期对异常的处理有强制性的要求。在JDK代码中大量的异常属于检查型异常,包括IOException,SQLException等。

在Java中所有RuntimeException的派生类都是非检查型异常,与检查型异常相对抛出非检查型异常可以不在函数声明中添加throws语句,调用函数上也不需要强制处理。

常见的NullPointException,ClassCastException是常见的非检查型异常。非检查型异常可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。

自定义异常类

不必拘泥于Java中已有的异常类,我们可以自己定义异常来满足需求。对于异常来说,有一个能够说明问题的类名就基本足够了。
Exception类继承自Throwable类,所以拥有了 PrintStackTrace()方法。此方法默认输出到System.err标准错误流中,可以放入实参System.out输出到标准输出流中。
Exception拥有 带String参数的构造函数,所以自己的异常类中可以做一个一样参数列表的构造函数。
定义新的异常类时,必须从已有的异常类继承。
图1 控制台 输出

4.接口中的异常

接口中抛出了异常,那么实现时就不能再抛出其他异常。
这个逻辑也可以用在基类中的函数上。


5.assert 断言

assert (布尔表达式)

若表达式为false,程序抛出 java.lang.AssertError 异常。

默认jvm是不支持断言的,需要用开关-enableassertions-ea来显式开启。
所以尽量不用断言吧,测试的时候使用Junit的assertEquals()方法即可。

6.带资源的try语句

英文名叫 try-with-resource block。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
司空见惯的Exception,你了解她的秘密吗?
大家好,我是指北君,对于Exception,不用说Java人都知道。指北君一直以来有个不治之症:对Java的一切东东有追根寻底的强迫症,不了解其所以然就睡不了觉,这不,为了能睡个好觉就带领大家探一探Exception的秘密。
43 0
异常Exception(Java基础篇)上
异常Exception(Java基础篇)上
43 0
java.io.InvalidClassException异常解决
java.io.InvalidClassException异常解决
171 0
记一次HDFS报EOFException异常的问题
现象 大晚上的收到线上DataNode挂掉异常的报警,值班同学随即做了重启处理,重启完成后,进程虽然在运行,但是NameNode的WebUI上显示大量的block丢失。 There are 12622047 missing blocks. Number of Under-Replicated Blocks 14436901 重新启动的DataNode节点block数量为0,明显不正常 HDFS在对丢失的block做恢复,missing blocks的数量在减少,但是丢失的的太多了,恢复速度很慢,这种情况肯定不能指望集群自动恢复的。
323 0
GirlFriendNotFoundException异常是怎样处理的?
GirlFriendNotFoundException异常是怎样处理的? 如果说要去创造这个异常,那么我们的JAVA程序里,肯定是继承Exception去处理,所有我们可以先实现一个自己的Exception /** * GirlFriendNotFoundExc...
985 0
ClassNotFoundException
代码报错: java.lang.ClassNotFoundException: com.tujia.core.filter.SecurityFilter at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) at org.apache.catalina.loade
1273 0
+关注
618
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载