java捕获和抛出异常
java 捕获和抛出异常
异常通常是程序运行时出现的问题和错误。如:客户输入数据的格式,读取的文件是否存在,网络是否保持通畅等。java程序在执行过程中发生的异常事件分为:异常和错误
异常:(Exception)
异常指程序运行过程中出现的非正常现象。可能遇到的轻微错误,可以写代码处理异常并继续继承执行,不应让程序中断。
错误:(Error)
错误事件的发生通常会阻止程序正常运行。对于java虚拟机无法解决的严重问题,如jvm系统内部错误,资源耗尽等情况,一般不编写针对性的代码进行处理。
对于被认为是不能恢复的严重错误,不应该抛出,而应该让程序中断。
错误与异常最大的区别是错误往往比异常严重,发生了错误,一般不能在应用程序中捕获处理,程序只能非正常终止运行。
异常的简单分类:
(1):检查性异常
最具有代表性的是用户错误或者是问题引起的而异常,这是程序员无法预见的。例如要打开一个不存在的文件时,异常就发生了,这些异常在编译时不能被简单的忽略。
(2):运行时异常
它是可能被程序员避免的异常,与检查性异常相反,运行时可以在编译时被忽略。
(3):错误
错误不是异常,而是脱离程序员控制的问题,错误在代码中通常被忽略。例如当栈溢出时,一个错误就发生了,他们在编译中也查不到。
java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
java异常层次结构图如下:
异常处理机制(捕获)
抛出异常:当出现异常事件时,系统会自动产生一个异常对象,然后将其传递给java运行时系统。这个异常产生和提交的过程称为抛出异常。
捕获异常:当java运行时系统得到异常对象以后,它将寻找处理这一异常的方法,找到之后,运行时系统把当前异常对象交给该方法进行处理。这一过程称为捕获。
异常处理的一般步骤为:异常抛出---->异常捕获---->异常处理
java异常机制主要依赖于try,catch,finally,throws,throw五个关键字。
try:它里面放置的是可能引发的异常类型。
catch:后面对应异常类型一个代码块,用于表明catch块用于处理这种类型的代码块。可以有多个catch块。
finally:主要用来处理后续事情。finally块总是被执行,如果finally中使用了return或者throw等终止方法的语句,不会跳回执行,而是直接执行。
下面来两个简单的代码示例:
分母不能为0的异常并捕获
package exception;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
// System.out.println(a/b);//出现异常,分母不能为0.ArithmeticException
//下面我们来捕获这个异常,try——catch
try {//try 用来检测区域
// System.out.println(a/b);
}catch (ArithmeticException e){//catch(可能发生的异常类型) 捕获异常
System.out.println("程序出现异常,变量不能为0");
}finally {//处理后续工作
System.out.println("finally");
}
}
}
方法的栈调用异常并捕获
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
// System.out.println(a/b);//出现异常,分母不能为0.ArithmeticException
//下面我们来捕获这个异常,try——catch
try {//try 用来检测区域
new Test().a();//通过对象点名来调用这个方法
}catch (Throwable e){//catch(想要捕获的异常类型)// 捕获异常
System.out.println("程序出现异常,变量不能为0");
}finally {//处理后续工作
System.out.println("finally");
}
}
public void a(){ b(); }
public void b(){ a(); }
}
当我们想捕获多个异常时,可以像循环结构那样,并列catch模块
多个异常捕获时
/*
当我们想要捕获多个异常时
catch(){
}catch(){
}catch(){
//括号内捕获的异常类型要从小到大去写。error>exception>throwable
}
*/
我们可以通过快捷键alt+Ctrl+T选中含有异常的代码语句,自动生成try-catch-finally。
throw语句
throw通常用来明确的抛出一个异常
if(异常条件1 成立)
throw new 异常1();
if(异常条件2 成立)
throw new异常2();
简单代码示例
在try检测模块内主动抛出异常
try {//try 用来检测区域
if(b==0){//使用throw关键字来抛出
throw new ArithmeticException();//主动抛出这个异常
}
System.out.println(a/b);
throws语句
throws语句用来声明一个异常。
public class Test {
public static void main(String[] args) {
try {
new Test().test(1,0);
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
}
}
//假设方法中处理不了这个异常,需要在方法上抛出异常
public void test (int a,int b) throws ArithmeticException{//在这个方法里声明这个异常
if (b == 0) {
throw new ArithmeticException();//主动抛出的异常,一般在方法中
}
System.out.println(a / b);
}
}