程序中总是存在着各种问题,为了使在程序执行过程中能正常运行,使用Java提供的异常处理机制捕获可能发生的异常,对异常进行处理并使程序能正常运行。这就是Java的异常处理。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error
;如果你用System.out.println(11/0)
,那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException
的异常
主要的异常类型有以下几种:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
异常的结构
从大体来分异常为两块:
1、error---错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm
运行时出现的OutOfMemoryError
以及Socket编程时出现的端口占用等程序无法处理的错误。
2、Exception --- 异常 :异常可分为运行时异常跟检查性异常
异常的处理
在Java中当程序出现异常时,可以使用 try···catch
和try···catch···finally
进行处理。
- 使用try···catch处理异常
try后是正常执行的语句,而catch后是对异常处理的语句,catch的括号中是程序需要处理的异常类型。语法格式如下:
try {
正常执行的语句
} catch(Exception e) {
对异常进行处理的语句
}
例:
public class Demo01 {
public static void main(String[] args) {
try {
int result = 1 / 0;
System.out.println(result);
} catch (Exception e) {
System.out.println("抛出异常:" + e.getMessage());
}
}
}
因为有异常,所以不执行try后的语句,从而执行catch后的语句。其中“e.getMessage()
”是获取异常信息的方法,用于获取详细消息字符串;此外还有printStackTrace()
方法,用于将其栈踪迹输出至标准错误流;toString()
方法用于获得简短描述。
- 使用try···catch···finally处理异常
finally关键字后的语句无论是否发生异常都要执行,因此finally语句块通常用于执行垃圾回收。语法格式如下:
try {
正常执行的语句
} catch(Exception e) {
对异常进行处理的语句
} finally {
一定会被处理的语句
}
例:
public class Demo02 {
public static void main(String[] args) {
try {
int result = 1 / 0;
System.out.println(result);
} catch (Exception e) {
System.out.println("抛出异常:" + e.toString());
}finally {
System.out.println("执行程序");
}
}
}
运行结果:
抛出异常:java.lang.ArithmeticException: / by zero
执行程序
关于finally 关键字
- finally 关键字用来创建在 try 代码块后面执行的代码块。
- 无论是否发生异常,finally 代码块中的代码总会被执行。
- 在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
抛出异常
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
- 使用throws声明抛出异常
throws用于方法声明,在声明方法时使用throws声明抛出异常,然后在调用该方法中对异常进行处理。语法格式如下:
数据类型 方法名(形参列表) throws 异常类1, 异常类2, ……, 异常类n {
方法体;
}
例:
public class Demo03 {
public void say() throws Exception {
int result = 1 / 0;
System.out.println(result);
}
}
- 使用throw声明抛出异常
如果希望程序自行抛出异常,可以使用throw语句来实现。语法格式如下:
throw new Exception("对异常的说明");
使用throw语句抛出的是异常类的实例,通常与if语句一起使用。如:
public class Demo03 {
public static void say() throws Exception {
int i = 3;
if (i >= 0){
throw new Exception("对异常的说明");
}else {
System.out.println("正确");
}
}
}