异常通常包含两大类:一个是Error一个是Exception他们有共同的基类Throwable
***一 Error(错误)***:
程序中无法处理的错误,表示运行应用程序中出现了严重的错误。是我们无法通过自己编写的代码解决的,也就是说如果平时编写代码出现这种错误,并不是我们代码的问题,你应该想到更多情况是JVM的问题
二 Exception(异常)
程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。
1 RuntimeException运行时异常(非受检异常):顾名思义就是运行时发现的异常, | |
---|---|
Java编辑器对代码进行编译时并不会发现,因为就不会去检查此类错误.
此异常的出处一般是我们的代码逻辑问题 比如
NullPointerException空指针异常(我们定义了引用却没给它指向的地址)、ArrayIndexOutBoundException数组下标越界异常(访问越界)、ClassCastException类型转换异常、
ArithmeticExecption算术异常
但是我们也可以通过 throws 进行声明抛出,也可以通过 try-catch 对它进行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!
RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。
编译时异常(受检异常): Exception 中除 RuntimeException 及其子类之外的异常。 | |
---|---|
特点: Java 编译器会检查它 | |
---|---|
如果程序中出现此类异常,比如 ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。该异常我们必须手动在代码里添加捕获语句来处理该异常。
三 异常处理
Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally
• try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
• catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
• finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件,例如如果执行了IO流语句出现异常时就要保证能关闭系统资源否则造成资源浪费系统资源不足)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
public static void IoException(String filepath){
try{
//code
}catch(IOException e)
//handle IOException
}catch(Exception e){
//handle Exception
}finally{
//Code that is sure to be run
}
• throw – 用于抛出异常。(手动在方法内部抛出一个指定的异常)
• throws – 用于声明该方法可能抛出的异常。
private static void read(String filePath) throws IOException {
File file = new File(filePath);
BufferedReader reader = new BufferedReader(new FileReader(file));
String num = null;
while((num = reader.readLine())!=null) {
System.out.println(result);
}
reader.close();
}
自定义异常
public class MyException extends Exception {
public MyException(){ }
public MyException(String St){
super(St);
}
}