Java基础练习 — 异常处理和递归


我们在写代码的时候,经常出现一些小问题,为了方便我们处理这些问题,Java为我们提供了异常机制。异常包含了错误的类型、原因以及位置。
异常:不正常,我们在写代码的时候出现的 编译或者 运行时的错误。

一、异常的体系结构

  1. Throwable最顶层
  2. ——Error:出现的不能够处理的严重问题
  3. ——Exception :可以处理的问题

二、异常的处理方式

捕获处理

  1. try...catch语句
    代码示例
try{
	有可能出现问题的代码; //出现异常,会创建一个对象
}catch(ArithmeticException e){
	处理异常; 
}
  1. try...catch的执行顺序:
    首先执行try语句,如果发现异常,异常下面的代码不再执行,直接跳入catch语句,catch语句结束后,整个try...catch结束;如果没有发现异常,try语句执行的结束后,try...catch直接结束,不再执行catch语句。

抛出去

当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁抛出,使用关键字throws在方法的声明处抛出异常。

三、JVM处理异常的方式

如果出现异常,我们没有处理,JVM会帮我们进行处理,它会把异常的类型、原因和位置显示在命令行,并且终止了程序,异常后面的代码将不再执行

四、如何处理多个异常

可以使用多个try...catch语句,一个try,多个catch

多个catch之间的顺序

  1. 平级之间没有顺序关系
  2. 如果有子父类,父类异常必须放在后面。
    代码示例
try{
	String s = null;
	System.out.println(s.length);
}catch(ArrayIndexOutOfBoundsException e){
	System.out.println("数组越界");
}catch(NullPointerException e){
	System.out.println("出现空指针");
}catch(Exception e){
	System.out.println("出现异常了");
}

五、Throwable的常用方法

try{
	可能出现问题的代码;
}catch(Exception e){
	System.out.println(e.getMessage()); //String getMessage();原因
	System.out.println(e.toString()); //String toString(); 类型+原因
	System.out.println(e.printStackTrace()); //void printStackTrace();类型+原因+位置
}

六、finally

组合try...catch使用,用于释放资源等收尾工作。
无论try...catch语句如何执行,finally的代码一定执行。
代码示例

try{
	有可能出现问题的代码;
}catch(Exception e){
	处理异常;
}finally{
	释放资源;
	清理垃圾;
}

七、异常的分类

  1. 运行时期异常:RuntimeException的子类就是运行时期异常,在编译时期可以选择处理或不处理。
  2. 编译时期异常:Exception的子类,非RuntimeException的子类,在编译时期必须处理

八、自定义异常类

  1. throws处理异常的方法,把异常跑出去,由调用者处理。
  2. throw制造异常的方式,并且结束异常。
    注意:如果抛出的是编译时期异常,必须在方法声明处抛出(throws)。

异常如何自定义呢?

写一个类去继承ExceptionRuntimeException,然后实现多个异常构造即可(给父类传递错误原因)。
代码示例

public static void main(String[] args){
	try{
		checkScore(110);
	}catch(Exception e){
		e.printStackTrace();
	}
}

public static void checkScore(int score) /* throws Exception*/{ //若继承编译时期异常Exception 
	if(score < 0 || score > 100){
		throw new MyException("考试成绩不符合要求");	
	}
	System.out.println("考试成绩符合范围"); //一旦上面抛出了错误,这一句不会执行,相当于else了
}
--------MyException类----------
public class MyException extends RuntimeException{ //若继承Exception编译时期异常,则上面checkScore方法需抛出错误
	public MyException(){
		super();	
	}
	public MyException(String message){
		super(message);
	}
}

错误类构造方法的生成:source -> generate constructors from superclass (选有参无参)。

九、递归

把大问题拆成小问题,然后把小问题拆成更多小问题,但我们把更多小问题解决了,小问题就解决了,随着小问题解决了,大问题也随之解决了。

5的阶乘代码示例

public static void main(String[] args){
	int result = jieCheng(5);
	System.out.println(result);
}
public static int jieCheng(int n){
	if(n == 1){ //必须要有出口,方法运行至出口后依次弹栈。
		return 1;
	}else{
		return n*jieCheng(n - 1) 
	}
}

不死兔子代码示例

public static void main(String[] args){
	int result = method(20);
	System.out.println(result);
}

public static int method(int n){\
	if(n == 1){
		return 1;
	}else if(n == 2){
		return 1;
	}else{
	return method(n - 1) + method(n - 2);
	}
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值