day14 异常(try-catch,finally,throws,throw,自定义异常类)-> java基础大神进阶学习总结之19天(知识点全面覆盖,细节)

java基础总结


day14 异常(try-catch,finally,throws,throw,自定义异常类)

对异常的理解

异常的继承体系

在这里插入图片描述

在这里插入图片描述

1.try-catch

  • ​ try-catch用来进行异常的捕获与处理
  • ​ 看需求可以一个try多个catch,具体问题具体分析
  • ​ 最好不要用一个Exception来代替其他异常,不要全部病都一个药来治
try{
	//可能出现异常的代码
}catch(要捕获的异常类型 变量){
    //有要捕获的异常的时候执行这里的代码
	//处理捕获到的异常的代码
    //通过这个变量去访问异常对象中封装的数据
}

在这里插入图片描述

如何获取异常信息,Throwable类的方法:
1):String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因).
2):String toString():获取异常的类型和异常描述信息(不用).
3):void printStackTrace():打印异常的跟踪栈信息并输出到控制台. 不需要使用System.out.println.
包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace.
记住:现在在catch语句块中,必须写:e.printStackTrace();目的:查看异常的具体信息,方便调试和修改.

2.finally

finally:表示最终的处理, 我们可以将代码最终必须执行的处理放在该代码块中

try{
	//可能抛出异常的代码
    
} catch(异常类型 变量){
	//处理异常代码
} finally{
	//无论有没有异常,最后都会执行的代码
}

3.抛出异常

1.throws(声明可能抛出的异常)

只是用来声明某个方法可能抛出某种异常,并不具有实际作用,也可以删掉

修饰符 返回值类型 方法名(参数列表..) throws 异常类A,异常类B...{
}

2.throw(用于抛出某种具体的异常)

真正用来抛出某种具体异常,可以自定义massage信息

public class ThrowDemo {
	public static void main(String[] args) {
		try {
			isExist("will");  
            
		}//相当于Exception e = new Exception("对不起,用户名" + userName + "已经存在") 
        catch (Exception e) {
			System.out.println(e.getMessage());//对不起,用户名will已经存在
		}
	}
public static boolean isExist(String userName) throws Exception {
	String[] data = { "will", "lucy", "lily" };//// 模拟已经注册的用户名
	if (userName != null && userName.length() > 0) {
		for (String name : data) {
			if (name.equals(userName)) {
				throw new Exception("对不起,用户名" + userName + "已经存在");
			}
		}
	}
	return false;
 }
}

3.抛出异常总结:

如果每一个方法都放弃处理异常都直接通过throws声明抛出,最后异常会抛到main方法,如果此时main方法不处理,继续抛出给JVM,底层的处理机制就是打印异常的跟踪栈信息.

4.自定义异常类

一个异常类只表示某一种特定的异常类型,在项目开发中,可能会出现特定的逻辑错误,此时开发者可以对这些错误进行封装成异常。比如我们可以定义一个LogicException用于表示业务逻辑异常。

自定义异常的两种方式,可以继承Exception类或RuntimeException类。**一般推荐继承RuntimeException类

扫描二维码关注公众号,回复: 11554050 查看本文章
public class Customer {
	String name;
public Customer(String name) {
	this.name = name;
 }
}

定义一个客户异常,专门表示抛出给用户看的异常类型。

public class CustomerException extends RuntimeException {
	//错误中可以添加自定义的属性,代表这个错误是针对哪个客户产生的。
	private Customer customer;
	public Customer getCustomer(){
        return customer;
    }
    public CustomerException(){}
    

public CustomerException(String message, Customer Customer) {
	super(message);	//勿忘,表示把传递的异常信息存储到异常对象中
	this.customer = customer;
}

}

测试类

public class ExceptionDemo {
	//定义一个方法,模拟在处理某个客户的时候出现了客户相关的逻辑错误
	public static boolean someCustomerLogic(String name) {
         //省略了若干业务代码
        //处理的客户对象
		throw new CustomerException("客户逻辑错误", new Customer(name));
	}

public static void main(String[] args) {
	try {
		someCustomerLogic("will");
	} catch (Exception e =new CustomerException("客户逻辑错误", new Customer(name))) {
		e.printStackTrace();
        System.out.println( e.getCustomer().getnamae().+e.getMessage());
		//如果在捕获到这个异常的时候,需要获得错问题的客户对象
	}
 }

}

猜你喜欢

转载自blog.csdn.net/weixin_41340417/article/details/107889755