异常
异常处理过程分析
- 一旦发生异常,则系统会自动生成一个异常类的实例化对象
- 此时如果存在了try 语句, 则会自动找到匹配的catch 语句执行,如果没有异常处理,则程序将推出,并由系统报告错误
- 所有的catch 根据方法的参数匹配异常类的实例化对象,如果匹配成功,则表示由此catch进行处理
使用 try{}catch(Exception e){} 捕获异常
finally 关键字
在进行异常的处理之后,在异常处理格式中还有一个finally 语句,那么此语句将作为异常的统一出口,不管是否产生了异常,最终都要执行此段代码(先于return 语句执行,只要return 在try 中)
try {
}catch(Exception e){
System.out.println("df");
}finally {
System.out.println("finally");
}
System.out.println("ddd");
/*
output:
finally
ddd
*/
throwable 是一个类, 实现了Serializable , 子类: Error,Exception, 是java 语言中所有错误或异常的超类
Error: 严重问题, 系统内部的错误,不管这个问题
Exception: 分两类 编译期异常 (受检异常) RuntimeException (非受检异常)
finally 先于catch() 子句执行
finally块在以下几种情况下不会执行
- finally 块中发生了异常
- 程序所在线程死亡
- 在前面的代码中用了System.exit()
- 关闭了CPU
throw 和 throws
在方法的声明上使用,表示方法中不处理异常,而交给调用处处理。实际上对于Java 程序来讲,如果没有加入任何的异常处理,默认由JVM进行异常的处理操作,throw 关键字表示在程序中手动抛出一个异常,因为从异常处理机制来看,所有的异常一旦产生之后,实际上抛出的就是一个异常类的实例化对象,那么此对象也可以由throw直接抛出
语法规则
- try 语句不能单独存在,可以和catch finally 组成,catch 可以有多个,finally 只能有一个。 这三个关键字均不能单独使用。
- 作用域独立而不能相互访问
- 多个catch 块时候, Java 虚拟机会匹配其中一个异常类或其子类,就执行这个catch 块,而不会再执行别的catch 块。
自定义异常
通常都是通过继承一个异常类实现
自定义异常实现是,提供构造方法
异常对象本身是没有实际功能,只是一个有意义的标识。
public class MyException extends Exception{
public MyException(){
super();
}
public MyException(){
super(message);
}
}
public class UserService{
public User login(String username, String password )throws MyException{
if(!"admin".equals(username)){
throw new MyException("用户名错误!");
}
if(!"12345".equals(password)){
throw new MyException("密码错误!");
}
User user = new User("admin", "12345",18,"男");
return user;
}
}
assert 关键字, 表示断言
当程序执行到某个固定位置的时候,程序中某个变量的取值肯定是预期的结果,那么这种操作可以使用断言完成。断言的操作语法: assert 表达式;
DEBUG
单步跳入: 进入本行代码中执行
单步跳出: 执行本行代码,跳到下一行