异常
https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
Definition: An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program’s instructions.
翻译:异常是程序执行过程中发生的事件,它会中断程序的正常指令流。
规则
程序可以使用异常来表示错误的发生。要抛出异常,使用 throw 语句并提供一个异常对象(Throwable 的后代),以提供有关发生的特定错误的信息。抛出未捕获的受检查异常的方法必须在声明中包含 throws 子句。
程序可以通过使用 try、catch 和 finally 块的组合来捕获异常。
try 块标识一个可能会发生异常的代码块。
catch 块标识一个称为异常处理程序的代码块,可以处理特定类型的异常。
finally 块标识一个代码块,它保证会被执行,并且是关闭文件、恢复资源以及清理 try 块中包含的代码的正确位置。
try 语句应至少包含一个 catch 块或一个 finally 块,并且可以有多个 catch 块。
异常对象的类表示抛出的异常的类型。异常对象可以包含有关错误的进一步信息,包括错误消息。通过异常链,异常可以指向导致它的异常,而该异常又可以指向导致它的异常,以此类推。
分类
Exception和Error的区别,Exception能被程序本身可以处理,Error无法被程序处理。
通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
Exception又分为:
1.可查异常(checked exceptions):是编译器要求必须处置的异常,正确的程序在运行过程中,很容易出现情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常,最典型的是IO类异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中出现了这类异常时,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
2.不可查异常(unchecked exceptions):编译器不要求强制处置的异常,包括运行时异常,即RuntimeException与其子类和错误(Error)。排除Error的情况,还可以将所有的Exception分为两大类:运行时异常和非运行时异常(非运行时异常也叫编译异常)。程序中应当尽可能的去处理这些异常。
代码
package com.exception.mark;
public class RuntimeExceptionTest {
public static void main(String[] args) {
/*
Exception in thread "main" java.lang.ArithmeticException
ArithmeticException extends RuntimeException
*/
System.out.println(1/0);
}
}
抛出运行时异常,非检查型异常
package com.exception.mark;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class CheckExceptionTest {
public static void main(String[] args) throws FileNotFoundException {
/*
FileNotFoundException extends IOException
IOException extends Exception
*/
FileInputStream fis=new FileInputStream("abc");
}
}
抛出非运行时异常,检查型异常,如果不写try catch 或者throws语句,编译不通过
自定义异常
package com.exception.mark;
public class CustomerException extends Exception{
public CustomerException() {
}
public CustomerException(String message) {
super(message);
}
public static void main(String[] args) {
//如果在某种条件下成立 则抛出自定义异常
if(true){
try {
throw new CustomerException("have customer exception");
} catch (CustomerException e) {
//写一些code处理 然后再抛出异常
throw new RuntimeException(e);
}
}
}
}
通常,自定义的异常类应该包含两个构造器,一个是默认的构造器;另一个是带有详细描述信息的构造器
特殊情况 finally有return的情况
package com.exception.mark;
public class FinallyReturn {
public static void main(String[] args) {
int value= f();
System.out.println("value:"+value);
}
public static int f(){
try{
return 1;
}
finally {
return 2;
}
}
}
当finally子句包含return语句时,将会出现一中意向不到的结果。假设利用return语句从try语句块中退出。在方法返回前,finally子句的内容将被执行。如果finally子句中也有一个return语句,这个返回值将会覆盖原始的返回值。