Java中异常处理

74 阅读4分钟

首先看一下异常的继承关系

Throwable
Error    严重问题,JVM内部出现的问题,我们不处理。
Exception
RuntimeException    运行期异常,由于代码的不严谨,我们需要修正代码
非RuntimeException 编译期异常,不处理程序编译不通过

综上所述,我们只需处理非RuntimeException的异常

首先我们讲解try...catch...finally

举个例子吧,为了容易举例,暂且以一个运行期异常为例,我相信你能看懂

package com.hezhiying;

public class Main {
	public static void main(String[] args) {
		int a = 10;
		int b = 0;
		System.out.println("在不判断b是否为0的情况下直接运行");
		System.out.println(a / b);
		System.out.println("运行正常");
	}
}

运行结果:

也就是说,当走到分母为0的时候就报错了,导致后面的程序无法进行,故我们需要异常处理

经过改进,虽然这个地方有报错,但是还能继续往下进行

package com.hezhiying;

public class Main {
	public static void main(String[] args) {
		int a = 10;
		int b = 0;
		System.out.println("在不判断b是否为0的情况下直接运行");
		try {
			System.out.println(a / b);
		} catch (ArithmeticException e) {
                //这里的异常时分母不为0,如果不知道什么异常,可以用其父类Exception
			System.out.println("有异常");
		}

		System.out.println("运行正常");
	}
}

运行结果:

但是这样不是太好,因为这样我们不知道异常出现在哪了,继续改进

package com.hezhiying;

public class Main {
	public static void main(String[] args) {
		int a = 10;
		int b = 0;
		System.out.println("在不判断b是否为0的情况下直接运行");
		try {
			System.out.println(a / b);
		} catch (ArithmeticException e) {
			e.printStackTrace();
			// System.out.println("有异常");
		}

		System.out.println("运行正常");
	}
}

运行结果:

这个就很好了,不仅能继续往下进行,还能告诉我们在异常的原因以及在哪异常了

对于异常的处理还有就是多个catch的

在这里只讲一下格式,用法跟一个一样

try {

            ...
} catch (...) {
...
}catch(...) {
...
}...

还有一个就是try…catch…finally

这里的finally下的语句,不管有没有异常都会执行,下面是一个有异常的例子

package com.hezhiying;

public class Main {
	public static void main(String[] args) {
		int a = 10;
		int b = 0;
		System.out.println("在不判断b是否为0的情况下直接运行");
		try {
			System.out.println(a / b);
		} catch (ArithmeticException e) {
			e.printStackTrace();
			// System.out.println("有异常");
		}finally {
			System.out.println("I am finally");
		}
		System.out.println("运行正常");
	}
}

运行结果:

再举一个没异常的例子:

package com.hezhiying;

public class Main {
	public static void main(String[] args) {
		int a = 10;
		int b = 0;
		System.out.println("在不判断b是否为0的情况下直接运行");
		try {
			System.out.println(a + b);
		} catch (ArithmeticException e) {
			e.printStackTrace();
			// System.out.println("有异常");
		}finally {
			System.out.println("I am finally");
		}
		System.out.println("运行正常");
	}
}

运行结果:

现在我们讲解throws和throw

throws是抛出异常的意思,把自己处理不了的,在方法上声明,告诉调用者,这里有问题,也就是抛给别人

throws在方法声明上,后面跟的是异常的类名,可以是多个

throws是声明方法有异常,是一种可能性,这个异常并不一定会产生

throw在方法体中,后面跟的是异常对象名,并且只能是一个

throw抛出的是一个异常对象,说明这里肯定有一个异常产生了

举个例子吧:

package com.hezhiying;

public class Main {

	public static void show() throws Exception {//在方法上声明,我是有问题的,调用时要注意
		int a = 10;
		int b = 0;
		System.out.println(a / b);
	}

	public static void main(String[] args) throws Exception {
		show();//这里在调用时继续抛出,在main里抛出就抛给了JVM了
		System.out.println("我能输出");
	}
}

运行结果:

在这里由于是抛给了JVM故,后面那句话没有输出了,对此我们进行了优化

package com.hezhiying;

public class Main {

	public static void show() throws Exception {//在方法上声明,我是有问题的,调用时要注意
		int a = 10;
		int b = 0;
		System.out.println(a / b);
	}

	public static void main(String[] args) {
		try {//在这里进行了处理
			show();
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("我能输出");
	}
}

运行结果:

对于throw就是在方法体中抛出一个对象,看个例子

package com.hezhiying;

public class Main {
	
	public static void show() throws Exception {
		int a = 10;
		int b = 0;
		if (b == 0) {
			throw new Exception();
		} else {
			System.out.println(a / b);
		}
	}

	public static void main(String[] args) {
		try {
			show();
		}catch(Exception e) {
			e.printStackTrace();
		}
                System.out.println("我能输出");
		
	}
}

运行结果:

这个异常处理,也就是中间出现了异常而不影响后面程序的运行。

都看到这了,希望我自己的理解也帮到了你