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类
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());
//如果在捕获到这个异常的时候,需要获得错问题的客户对象
}
}
}
下一篇: java实现mongodb的数据库连接池