异常+异常链
Posted big-data-sky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常+异常链相关的知识,希望对你有一定的参考价值。
异常:
- 在程序运行过程中发生的不正常事件
- Java中所有异常都是Exception(父类)
- 传统处理程序中异常:
- System.exit(1);参数必须为非0数,结束/退出JVM(java虚拟机)
- System.err.println();控制台输出错误流,为红色字体。
- 异常处理机制:
- 为程序提供错误处理的能力
- 5个关键字:
- try 执行可能产生异常的代码
- catch 捕获异常
- finally 无论是否发生异常,代码都能执行
- throw 声明异常,声明方法可能要抛出的各种异常
- thorws 手动抛出异常
语法:
try //代码段(此处不会出现异常) catch(异常Exception或Exception的子类) //对异常进行处理的代码段 //代码段 public class Test1 public static void main(String[] args) Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); // 除数为0异常: ArithmeticException // 输入格式不正确: InputMismathException(子类) try //程序中可能出现异常的代码 int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1+"/"+ num2 +"="+ num1/ num2); catch(ArithmeticException e) //在程序出现异常的情况下执行的代码 System.err.print("出现错误操作"+"\n"); //异常对象 e printStackTrace();打印异常堆栈信息 e.printStackTrace(); System.out.println("感谢使用本程序!");
- 无异常。try->catch直接执行后面代码
- 有异常,与cetch后面异常类型匹配 : try->catch里面代码->后面代码
- 有异常,与cetch后面异常类型不匹配:try->中断,结束运行
- printStackTrace();打印异常堆栈信息
- getMessage();获得异常字符串提示信息,打印需使用输出语句
tyr–cetch–finally语法:
try //代码块 cetch() //代码块 finally //代码块 public class Test2 public static void main(String[] args) Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); // 除数为0异常: ArithmeticException // 输入格式不正确: InputMismathException(子类) try //程序中可能出现异常的代码 int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1 + "/" + num2 + "=" + num1 / num2); catch (ArithmeticException e) //在程序出现异常的情况下执行的代码 System.err.print("出现错误操作" + "\n"); // 异常对象 e printStackTrace();打印异常堆栈信息 e.printStackTrace(); finally System.out.println("感谢使用本程序!");
- finally不执行的情况:
- 在cetch代码块中结束JVM(如:System.exit(1))运行情况下finally代码块不执行
- cetch代码块存在return时,会先执行finally代码块,最后执行return
多重cetch块:
try //代码块 cetch() //代码块 cetch() //代码块 cetch() //代码块 finally //代码块 public class Test3 public static void main(String[] args) Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); // 除数为0异常: ArithmeticException // 输入格式不正确: InputMismatchException(子类) try int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1 + "/" + num2 + "=" + num1 / num2); catch (ArithmeticException e) System.err.print("除数不能为0" + "\n"); // 异常对象 e printStackTrace();打印异常堆栈信息 e.printStackTrace(); catch (InputMismatchException e) System.err.print("输入格式不正确" + "\n"); e.printStackTrace(); catch (Exception e) System.err.print("未知异常" + "\n"); e.printStackTrace(); finally System.out.println("感谢使用本程序!");
约束条件:越具体的子异常类放在catch首位,越抽象的父异常类越往后写
cetch语句顺序:先子类,后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的cetch语句
try块为必须,但不能单独出现。
throws :
- 声明某个方法可能抛出的各种异常,多个异常用逗号隔开。
- 调用者处理异常
- 调用者继续声明异常
- Main()方法声明的异常由JVM处理。
public void 方法名()throws 异常类型 //代码块 public static void main(String[] args) 类名 t = new 类名(); try t.方法名();
public static void a() throws ArithmeticException int num=5/0; throw new ArithmeticException("除数不能为0"); public static void b() try a(); catch(ArithmeticException e) e.printStackTrace();
或者继续抛出:
public void 方法名()throws 异常类型 //代码块 public static void main(String[] args) throws 异常类型 类名 t = new 类名(); t.方法名(); public static void main(String[] args) try b(); catch(ArithmeticException e) e.printStackTrace(); public static void a() throws ArithmeticException int num=5/0; throw new ArithmeticException("除数不能为0"); public static void b() throws ArithmeticException a();
throw:
- 抛出异常。
public void 方法名()throws Exception throw new Exception(“性别只能为男女”); throw new ArithmeticException("除数不能为0");
throw必须处理或者继续抛出异常。
throw 与 throws
- throw:
- 生成并抛出异常
- 位于方法体内部,可作为单独语句使用
- 抛出一个异常对象,且只能是一个
- throws
- 声明方法内抛出了异常
- 必须跟在方法参数列表后面,不能单独使用
- 声明抛出异常类型,可以跟多个异常
异常处理原则:
- 异常处理与性能
- 异常只能用于非正常情况
- 不要将过于庞大的代码块放在try中
- 在catch中指定具体的异常类型
- 需要对捕获的异常做处理
- 异常分为Checked异常和运行时异常:
- Checked异常必须捕获或者声明抛出
- 运行时异常不要求必须捕获或者声明抛出
常见异常类型:
- Exception 异常层次结构的父类
- ArithmeticException 除数为0异常
- InputMismathException 输入格式不正确
- ArrayIndexOutOfBoundsException 数组下标越界异常
- NullPointerException 空指针异常
- ClassNotFoundException 不能加载所需的类
- IIIegalArgumentException 方法接收到非法参数
- ClassCastException 对象强制类型转换出错
- NumberFormatException 数字格式转换异常,如把”abc”转换成数字
异常链:
- 由一种异常引发另一种异常
- 异常链创建了新的异常但却包含了原有异常的信息。
- 自定义一个登录与注册异常类继承父类Exception,重写父类构造方法
public class LoginFaildException extends Exception public LoginFaildException() super(); public LoginFaildException(String message, Throwable cause) super(message, cause); public LoginFaildException(String message) super(message); public LoginFaildException(Throwable cause) super(cause);
-
- 定义用户类,声明用户名与密码,添加构造方法
public class User private String userName; private String passWord; public String getUserName() return userName; public void setUserName(String userName) this.userName = userName; public String getPassWord() return passWord; public void setPassWord(String passWord) this.passWord = passWord;
-
- 声明注册与登录方法
// 注册方法 public static boolean register(User user) throws RegisterException //声明一个返回值为布尔类型的方法 boolean flag = false; //声明返回值变量 if (user.getUserName() == null) if (!flag) throw new RegisterException("用户名不能为空,注册失败"); //抛出注册异常 else return true; else if(user.getPassWord().equals(null)) return false; return true; // 登录方法 public static void login(User user) throws LoginFaildException try boolean register= register(user); catch (RegisterException e) e.printStackTrace(); throw new LoginFaildException("登录失败",e); //核心代码,将注册与登录异常抛给登录异常构造方法
-
- 在main方法中调用登录方法
public static void main(String[] args) User user = new User(); try login(user); catch (LoginFaildException e) e.printStackTrace(); //抛出异常
-
- 运行结果如下:
exception.RegisterException: 用户名不能为空,注册失败 at test.Test4.register(Test4.java:23) at test.Test4.login(Test4.java:36) at test.Test4.main(Test4.java:12) exception.LoginFaildException: 登录失败 at test.Test4.login(Test4.java:40) at test.Test4.main(Test4.java:12) Caused by: exception.RegisterException: 用户名不能为空,注册失败 at test.Test4.register(Test4.java:23) at test.Test4.login(Test4.java:36) ... 1 more
以上是关于异常+异常链的主要内容,如果未能解决你的问题,请参考以下文章
使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段
mvn命令异常:An error has occurred in Javadoc report generation: Unable to find javadoc command异常已解决(代码片段
mvn命令异常:An error has occurred in Javadoc report generation: Unable to find javadoc command异常已解决(代码片段