异常处理
1.异常概述
异常概述
Java中将程序执行出现的一些意外情况分为两种:
1.错误(Error)
错误一般是JVM虚拟出现的一些内存不足,或者资源耗尽的系统级别错误(比如:栈溢出,JVM错误等),这些问题对于程序员来说无法从根本上解决。
2.异常(Exception)
异常指的是程序在编译或者执行过程中出现的一些外在因素导致的问题(比如:数组索引越界,空指针异常,类型转换异常等),这些问题程序员一般是可以解决的,因此异常需要重点关注。
2.异常分类
Java中将异常分为两大类,第一大类称之为编译时异常(一般异常/检查异常);第二大类称之为运行时异常(RuntimeException)
编译异常
编译异常也称之一般异常,检查异常;这种类型异常一般表现为在编译期间,由编译器直接抛出,需要由程序员进行手动处理。常见如下:
- FileNotFoundException
- IOException
- ClassNotFoundException
- ParseException
- …
运行时异常
在编译期间正常通过,在JVM执行程序时,出现的异常称之为运行时(Runtime)异常,运行时异常是所有异常中最常见的异常,常见如下: - ArrayIndexOutOfBoundsException
- NullPointerException
- ArithmeticException
- ClassCastException
- …
3.异常处理
Java中的异常处理分为两种方式:
- 异常抛出(throw)
- 异常捕获(catch)
异常处理的常见关键字:
- throws:一般作用于方法上,将有可能出现异常抛出,交给下一级调用者处理
- throw:
- try
- catch
- finally
异常抛出
异常抛出通常使用throws关键字,在方法的声明上将有可能出现的异常抛给下一级的调用者处理,异常抛出是一种实际开发中非常常见的处理异常的方式。
public class Demo2 {
/**方法抛出了异常,将由下一级调用者处理*/
public void m1() throws FileNotFoundException{
FileInputStream fis = new FileInputStream("c:/a.txt");
}
/**该方法调用了m1方法,因此需要处理m1中的异常,另外:m2方法可以抛出比m1方法范围更大的异常*/
public void m2() throws IOException{
System.out.println("第二个方法");
m1();
}
/**检查异常最终可以抛给主方法由JVM进行最终处理(打印异常信息到标准输出流)*/
public static void main(String[] args) throws IOException{
new Demo2().m2();
}
}
异常捕获
由于异常的抛出是一种临时性解决方案,最终异常还是需要有处理机制,因此异常的捕获就是为了解决这些问题而存在的另一种异常处理方案。异常捕获的语法结构
try{
//有可能出现异常的代码片段
}catch(异常类型 引用){
//异常的解决(打印异常信息到标准输出流/记录到日志文件)
}finally{
//不论是否出现异常都会执行(一般用于回收资源等操作)
}
public class Demo5 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
//捕获有可能出现异常的语句块
fis = new FileInputStream("d:/nginx服务器配置模板");
} catch (FileNotFoundException e) {
//一旦出现匹配的异常类型,则进入catch语句块
e.printStackTrace();
} finally{
//无论是否出现异常,都会进入finally语句块
try {
if(fis != null){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}