十一、异常处理

一、异常

1、概念

  • 异常是一种Exception类型的对象。
  • 方法在运行期间遇到问题时抛出异常

2、语句结构

1)简单的异常声明

try{//可能会有风险的语句
}catch(Exception ex){
//声明在异常情况下,需要执行的语句。catch中的类似于方法的形参定义
}

2)有风险会抛出异常的程序代码

概念
  • 方法可以抓住其他方法抛出的异常,异常总是会丢回给调用方
  • 会抛出异常的方法必须要声明它有可能会这么做
  • 方法可以用throw关键词抛出异常对象:throw new FilesTooSmallException();
  • 可能抛出异常的方法必须声明成throws Exception
语句
public void takeRisk()throws BadException{//throws是声明会抛出Badexception
		if(abandonAllHope){//如果抛弃了所有可能
			throw new BadException();//创建新的对象并抛出
		}
	}
		public void crossFiguers(){
			try{
				anObject.takeRisk();//将调用的可能会出现异常的方法放在try中
			}catch(BadException ex){//有风险的方法如果抛出异常可以用catch来捕获,以达到改正的目的
				System.out.println("Aaargh!");
				ex.printStackTrace();//如果没有从异常中恢复,可以用这种方法来列出有用的信息
			}
		}

3)try/catch块的流程控制

执行顺序
	try{
		Foo f=x.doRiskeyThing();//调用可能会有异常的方法
		int b=f.getNum();
	}catch(Exception e){
		System.out.println("failed");
		
	}
	System.out.println("we made it!");
  • 如果try中可能会出现异常的部分在执行过程中没有出现异常,那么按照语句顺序正常执行try中所有语句,catch部分不执行,直接跳到System.out.println(“we made it!”);
    -如果try中可能会出现异常的部分在执行过程中出现异常,那么执行在try中的部分立即停止,try中以后的部分不会执行,然后跳转到catch部分继续执行,最后接着执行System.out.println(“we made it!”);
Finally部分
  • 在以上执行顺序中有一个System.out.println(“we made it!”); 部分,可以发现,无论异常是否出现,这一部分都是需要执行的,那么就可以用finally实现其表示
finally{
System.out.println("we made it!");//也可以在这里面调用方法
}
  • 除了用finally表示必须要执行的部分以外,也可以在try和catch部分分别来说明必须要执行的语句,这样也可以实现无论异常是否出现,必要执行的部分都会被执行
执行顺序的例子

public class Example {
	public static void main(String[]args){
		String test="no";
		try{
			System.out.println("Start try");
			
			doRisky(test);
			System.out.println("end try");
		}catch(ScaryException se){
			System.out.println("scary exception");
		}finally{
			System.out.println("finally");
		}
		System.out.println("end of main");
	}
	static void doRisky(String test)throws ScaryException{
		System.out.println("start riskey");
		if("yes".equals(test)){
			throw new ScaryException();
		}
		System.out.println("end risky");
		return;

	}

public class ScaryException extends Exception {//如果没有这部分,ScaryException将会无意义,没有这种类型

}

结果


public class Example {
	public static void main(String[]args){
		String test="yes";
		try{
			System.out.println("Start try");
			
			doRisky(test);
			System.out.println("end try");
		}catch(ScaryException se){
			System.out.println("scary exception");
		}finally{
			System.out.println("finally");
		}
		System.out.println("end of main");
	}
	static void doRisky(String test)throws ScaryException{
		System.out.println("start riskey");
		if("yes".equals(test)){
			throw new ScaryException();
		}
		System.out.println("end risky");
		return;

	}

	

}

public class ScaryException extends Exception {//如果没有这部分,ScaryException将会无意义,没有这种类型

}

结果

4)多重异常

public class Laundry{
  public void doLaundry()throws PantsException,LingerieException{
//有可能抛出两个异常的程序代码
}
  
}
public class Foo {
	public void go(){
		Laundry laundry=new Laundry();
		try{
			laundry.doLaundry();
		}catch(PantsException pex){
			//恢复程序代码
		}catch(LingerException lex){
			//恢复程序代码
		}
	}

}


public class PantsException extends Exception {

}


public class LingerException extends Exception {

}

3、异常的多态

  • 异常是对象,除了可以被抛出外,没有什么特别的地方
  • 注意:存在多个catch块时,而且catch块之间存在着继承关系,那么就要先写比较小的,然后逐渐增大,到父类。例如从ShirtException到ClothingException
1)以异常的父型来声明会抛出的异常
  • 在这种情况下,抛出的是父型异常,那么在catch的时候可以使用该父型异常的任何一种子类解决方案
 public void doLaundry()  throws ClothingException{//异常的父型,ClothingException包括Pants,T-ShirtException等
		//有可能抛出两个异常的程序代码
		}
try{
			laundry.doLaundry();
		}catch(PantsException pex){//可以选择任何ClothingException的子类
			//恢复程序代码
		
	}

4.避免处理异常

1.

  • 声明要抛出的异常,但是这个异常并没有try或者catch块来处理风险就是在避免处理异常
  • 声明抛出异常,但没有try/catch块就会将异常留给调用方
	 public void doLaundry()  throws ClothingException{//只是声明
		//调用有风险的方法
		}

2.main()避免处理异常

public class Washer{
	Laundry laundry=new Laundry();
	public void foo()throws ClothingException{
		laundry.doLaundry();
	}
	public static void main(String[]args)throws ClothingException{//同样不包含处理异常的部分
		Washer a=new Washer();
		a.foo();
		
	}
}

public class ClothingException extends Exception {

}

5.异常处理规则

  • catch与finall不能没有try
  • try与catch之间不能有程序
  • try一定要catch或者finally
  • 只带了finally的try必须要声明异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
try catch语句用于捕获和处理异常。当在try块中的代码抛出异常时,catch块中的代码被执行。通过使用catch块,我们可以选择性地处理或处理异常,避免程序终止运行。 在catch块中,我们可以使用异常类Exception来捕获并处理各种类型的异常。由于Exception是其他异常类的父类,因此如果抛出的异常是Exception的子类,也可以匹配到相应的catch块并执行相应的逻辑。这就是所谓的"向上转型"。例如,我们可以使用Exception来捕获NullPointerException异常。 除了try catch语句外,还可以使用finally块来加入对异常的处理。在finally块中的代码将在try块中的代码执行完毕后无论是否抛出异常都被执行。这在一些需要确保资源释放的情况下非常有用。 总结来说,try catch语句用于捕获和处理异常,而抛出异常可以使用throw关键字主动抛出。通过使用catch块和finally块,我们可以选择性地处理异常并确保资源的正确释放。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java笔记(十一)——异常 try catch / throw / throws](https://blog.csdn.net/qq_50916191/article/details/113097308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [java 异常四](https://blog.csdn.net/u011573551/article/details/51356840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值