1.什么是异常
程序运行时,发生了不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。
异常错误的原因:可能是JVM的原因,也有可能是程序本身的原因
2.常见的异常
- 检查性异常
- 运行异常
- 错误(error): 错误不是异常,而是脱离了程序员控制的问题
3.用什么来处理这些异常
java有异常处理的机制,可以把所有的异常当做对象来处理
java异常处理的几个关键字: try
、catch
、finally
、throw
、throws
。
- try -- 用于监控异常的区域
- catch -- 捕获程序中的异常
- finally -- 处理善后的工作(可以要finally,也可以不要finally,主要作用是关闭一些IO及数据库连接的资源)
- throw -- 用于抛出异常
- throws -- 主动抛出异常,一般在方法中使用,用于声明该方法可能会抛出异常
4.详细示例
4.1 捕获异常
代码
package exception.demo01;
public class Demo02 {
public static void main(String[] args) {
int a = 3;
int b = 0;
System.out.println(a / b);
}
}
运行结果
从运行结果来看,程序出现了ArithmeticException
异常
为了解决这个异常,我们可以使用try-catch
来捕获该异常
代码如下所示
package exception.demo01;
public class Demo02 {
public static void main(String[] args) {
int a = 3;
int b = 0;
try {
System.out.println(a / b);
}catch (ArithmeticException e) { //catch中参数说明 想要捕获的异常类型
System.out.println("捕获异常,被除数不可以为0");
}finally { //处理善后的工作,如关闭数据流的操作
System.out.println("程序结束");
}
}
}
异常处理后的结果
4.2 捕获错误
有时,我们写程序的时候,由于自己的疏忽,导致程序出错了,这时就会出现一个严重的错误
如果这个错误不解决,就会导致我们程序的提前终止
为了解决这个问题,我们也可以将错误捕获起来
如下面代码所示
package exception.demo01;
public class Demo02 {
public static void main(String[] args) {
new Demo02().a();
}
public void a(){
b();
}
public void b(){
a();
}
}
运行结果
我们发现程序出现了错误 StackOverflowError
这时我们捕获程序错误就不能通过捕获异常的方式去捕获,我们需要一个最大的父类去捕获这个错误
代码如下所示
package exception.demo01;
public class Demo02 {
public static void main(String[] args) {
try {
new Demo02().a();
}catch (Throwable t) { // 这时一个最大的父类,其中包含了error和异常
System.out.println("出现了栈溢出的错误");
}
}
public void a(){
b();
}
public void b(){
a();
}
}
运行结果如图所示
4.3 对于多个异常的捕获
/**
* 如果要捕获多个异常 可以使用多个catch块
* 注意 最大的异常应该放在最后,不然小异常捕获不到
*/
try {
new Test().a();
}catch (Error e){
System.out.println("Error");
}catch (Exception e){
System.out.println("Exception");
}catch (Throwable t){
System.out.println("Throwable");
}
4.4 通过throw抛出异常
package exception.demo01;
public class Test2 {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
if (b == 0){ // 主动的抛出异常 throw throws
// 主动抛出异常,一般在方法中使用
throw new ArithmeticException();
}
} catch (Exception e) {
// 增加一些处理异常的代码
e.printStackTrace(); // 打印错误的栈信息
}
}
}
执行结果
4.5 自定义异常
首先创建一个MyException.java
的异常类,继承Exception
package exception.demo01;
/**
* 创建一个自定义的异常类
*/
public class MyException extends Exception{
private int detail;
public MyException(int a){
this.detail = a;
}
//toString:异常信息的打印
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}
编写测试类(没有异常的情况)
package exception.demo01;
public class Test3 {
//可能会存在异常的方法
static void test(int a) throws MyException{
if (a > 10){
throw new MyException(a);
}
System.out.println("OK!");
}
public static void main(String[] args) {
try {
test(1); // 1 < 10 不会出现异常
} catch (MyException e) {
System.out.println("MyException=>" + e);
}
}
}
编写测试类(有异常的情况)
package exception.demo01;
public class Test3 {
//可能会存在异常的方法
static void test(int a) throws MyException{
if (a > 10){
throw new MyException(a);
}
System.out.println("OK!");
}
public static void main(String[] args) {
try {
test(11); // 11 > 10 会出现异常
} catch (MyException e) {
System.out.println("MyException=>" + e);
}
}
}