Java异常处理内容整理

1.异常处理

1.1

Java异常处理主要分两部分,编译时异常和运行时异常,即checked 和 runtime。
编译时异常必须在程序运行之前解决否则没法运行程序,runtime异常则是不确定的,只有在实际运行中才能发现。
所有的异常都继承自Throwable。

1.2runtime异常处理机制

五个关键字try、catch、finally、throw、throws
try、catch类似if,then。如果出错了,则查看出错类型,匹配对应catch去处理异常。
1.2.1try:包括一对{},不能省略,即使try中只有一条语句。try中存放可能会出错的语句
举个简单例子

public class Exception_1 {
	private String inform1;
	private String inform2;
	
	public Exception_1(String inform1) {
		this.inform1 = inform1;
	}
	public String getInform1() {
		return inform1;
	}
	public String getInform2() {
		return inform2;
	}
}
public class Exception_2 {
	private ArrayList<Exception_1> list = new ArrayList<Exception_1>();
	
	public void add(Exception_1 mes) {
		list.add(mes);
	}
	public void search(String inform) {
		for(Exception_1 mes : list) {
			//try {
				if(mes.getInform1().contains(inform) ||
				   mes.getInform2().contains(inform)) {
					System.out.println(printMessage(mes));
				}
			//} catch (NullPointerException e) {
				//System.out.println(e.getMessage());
			//}
		}	
	}
	private String printMessage(Exception_1 mes) {
		return mes.getInform1() + " " + mes.getInform2();
	}
}
public class Exception {

	public static void main(String[] args) {
		Exception_2 test = new Exception_2();
		test.add(new Exception_1("NullPointer"));
		test.add(new Exception_1("Algorithm"));
		test.add(new Exception_1("IndexofBounds"));
		test.add(new Exception_1("NumberFormat"));
		test.add(new Exception_1("ClassCast"));
		test.search("zhangsan");
	}
}

其中printMessage(inform)是一个返回String类型的打印函数。倘若没有添加异常处理语句,当调用这个search方法且inform这在这个list中时会抛出一个NullPointerException(空指针)异常。抛出原因主要是因为我第二个关键字内容为null(可以调用异常对象的getMessage()获得异常信息)。

1.2.2catch:catch后()内包含异常对象类型

catch后的{}也不能省略,代码块中包含对异常的处理逻辑,像上边程序,知道异常原因之后,就可以添加一个空代码块,因为我可能会存储一条信息或者不存储。
常见的异常对象有:
NullPointerExceptioin
IndexOutOfBoundsException
ClassCastException
NumberFormException
ArithmeticException
记住这些常见异常处理信息可以帮我们快速解决问题。
catch必须要跟在try后,try后可以跟多个catch(异常对象不同),try中代码出现异常之后,会根据catch后的()寻找相匹配异常对象就行处理。
try、catch、finally书写格式
因为上边列出的几种异常都是继承自Exception这个类,因此当存在小异常时(Exception的子类异常)应该放在靠近try的位置之后,即在Exception之前。这主要是因为,父子类问题,毕竟子类是特殊的父类嘛,因此遇到父类会先执行。
catch()内可以包含多个异常处理对象,对象之间使用‘|’隔开,并且多个对象之间有隐式的final修饰。catch()内置包含一个异常对象时则没有。

1.2.3finally:必须依存于try,有try可以没有finally,有finally则一定有try

finally作用:因为其特殊性,可以用来关闭物理资源信息,Java垃圾回收机制只会回收内存资源而忽略物理资源。其特殊性?finally总会被执行,除非在try或catch中退出虚拟机,否则一定会执行!!!
finally关键字注意事项:最好不要再finally中使用return等语句,因为在finally中使用之后,try,catch的其他语句得不到执行。
关闭物理资源:Java7以后便更新了新的try功能,即try之后()内可以用来关闭物理资源,()内对象必须使用final修饰或者时有效final修饰,何为有效final,即初次赋值且之后未被修改过。

1.2.4throws

throws:存在throws的方法不知道怎么处理throws抛出的异常,因此将这个异常丢给了这个方法的调用者。如果这个方法的调用者也不知道怎么处理,最终会丢到给main方法,main方法同样不知道的情况写,则main会抛给虚拟机。丢给虚拟机的话,虚拟机处理起来就简单粗暴了,打印异常信息,然后结束程序。
因此最好有一个try、catch语句来协助处理异常。这个try 、catch通常在方法的上一层出现
throws语法:位于方法的形参列表之后,即括号后边,花括号前边。
注意:当存在继承关系,方法重写时,子类方法的throws的异常对象必须时父类重写方法抛出对象的子类或者相同类型,否则会报错
父类中的方法

public String getInform1() throws NullPointerException{
	return inform1;
}

子类重写的方法

@Override
public String getInform1() throws Throwable{
	return super.getInform1();
}

因为NullPointerException时Throwable的子类,因此编译时会报错。还有就是子类申明的异常对象不能比父类多

1.2.5throw

throw同throws的区别:throw抛出的是异常实例,而throws是类。throw是在程序中自行抛出

1.2.5.1throw面对checked异常和非checked异常有不同的规则

checked:必须显示处理异常。即必须放在try、catch块中或者,放在带有throws的方法中
runtime:可以不必显示处理

1.3自定义异常类

1.区分异常的类型,即是checked还是runtime
2.自定义一场都应该继承Expection,如果要自定义runtime异常则应该继承RuntimeException
3.定义异常类需要提供两个构造器,一个有参,一个无参。有参的构造器需要显示调用父类的构造及(super),方便将异常信息传递给getMessage()

public class Exception_3 extends Exception{
	public Exception_3() {}
	public Exception_3(String msg){
		super(msg);
	}
}
class Exception_4 extends RuntimeException{
	public Exception_4() {}
	public Exception_4(String msg){
		super(msg);
	}
}

1.4异常处理使用规范

不要使用庞大的try语句
不要过度使用异常处理
使用异常处理应该要
是程序混乱最小化
捕获并保留信息
采用合适方式结束程序

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值