异常体系
- Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类。
- Error错误,一般是指与虚拟机有关的问题,如系统崩溃等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此对于这类错误,Java编译器不去检查他们。通常遇到这类错误导致的应用程序中断,仅靠程序本身无法恢复和预防,建议让程序终止。
- Exception异常表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
- Exception又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception )。
- RuntimeException:其特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try……catch捕获,也没有用throws抛出,还是会编译通过,如除数为零、错误的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。
- 受检查的异常(IOException等):这类异常如果没有try……catch也没有throws抛出,编译是通不过的。这类异常一般是外部错误,例如文件找不到等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
- 注意:Java语言中有RuntimeException这个异常类,但是并没有CheckedException这个异常类,只是宏观上把除了RuntimeException类以外的异常类都归属到受检查的异常(Checked Exception)中
异常处理方法
JVM默认处理异常的机制
- main函数收到异常情况是,可以分为两种情况
- 自己处理,然后继续运行后面的代码
- 交给main方法的JVM处理,处理结果为:将异常的基本情况打印在控制台,结束进程。
程序员自己处理
- try……catch……finally 处理异常后,继续执行后面的进程
try{ try 用来检测异常 }catch(NullPointException e){ 可以有多个catch }catch(Exception e){ catch 用来捕获异常 }finally{ finally用来释放资源 如:关闭数据库、流 }
``
(1) 注意一:try语句块不可以省略,catch/finally语句块至少二取其一,可以两个都要
(2) 注意二:try……catch……finally 语句中可以嵌套try……catch……finally 语句。
-
throws和throw关键字
定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。
编译时异常:必须抛出;运行时异常:也可以不处理,不抛出throws 和throw的区别:
(1) throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常
public static void main(String[] args) { String s = "abc"; if(s.equals("abc")) { throw new NumberFormatException(); } else { System.out.println(s);(2) throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常),当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。
public class ThrowsThrow { public static void main(String[] args) { try { read("g:/nihao.jpg"); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static String[] read(String fileName) throws FileNotFoundException{ return a(fileName); } public static String[] a(String fileName) throws FileNotFoundException{ return b(fileName); } public static String[] b(String fileName) throws FileNotFoundException{ return c(fileName); } public static String[] c(String fileName) throws FileNotFoundException{ throw new RuntimeException(); } }
创建异常类
- 主要是继承RuntimeException,生成不同的构造方法,然后增加或改写属性或方法
public class UserLoginAuthenticationtException extends RuntimeException{
private String currentOperation;
public UserLoginAuthenticationtException() {
super();
}
public UserLoginAuthenticationtException(String message,String currentOperation) {
super(message);
this.setCurrentOperation(currentOperation);
}
public UserLoginAuthenticationtException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
}
public UserLoginAuthenticationtException(String message, Throwable cause) {
super(message, cause);
}
public UserLoginAuthenticationtException(String message) {
super(message);
}
public UserLoginAuthenticationtException(Throwable cause) {
super(cause);
}
public void setCurrentOperation(String currentOperation) {
this.currentOperation = currentOperation;
}
}