Java的异常处理机制
抛出异常
- 关键字throw和throws
- 注意:throw和throws不一样!!
- 抛出的异常用于在main方法中解决
代码例子:
package Demo01;
public Application{
public static void main(String[] args){
try{
new Application().test(10,0);
}catch(ArithmeticException e){
e.printStackTrace();
}
}
//假设这个方法处理不了这个异常,则我们可以在方法中抛出这个异常
public void test(int a,int b) throws ArithmeticExceptio{
if(b==0){
throw new ArithmeticException(); //主动抛出一个异常,一般在方法中使用
}
}
}
捕获异常
- 关键字catch
- 在我们程序出现异常的时候,程序一般会报出一个错误之后停止运行,但是这是我们不想出现的,因此我们会选择捕获这个程序的异常情况并使它以另一种形式输出。
代码例子:
package Demo02;
public Application{
public static void main(String[] args){
int a=666;
int b=0;
try{
System.out.println(a/b); //要执行的代码块
}catch(ArithmeticException e){ //此处的e可以自己定义,而e旁边的则为想要捕获的类型
System.out.println("程序出现异常,b不能为0"); /*如果上面的代码块出现异常,其程序自己抛出异常后,将会被此处代码块捕获异常,并在此处处理异常,然后往后执行*/
}finally{
System.out.println("我无论如何都会出来"); //finally关键字代表此代码块无论上面的代码是否有异常都会执行
}
}
}
/*
输出内容:
程序出现异常,b不能为0
我无论如何都会出来
*/
- 此代码中的“finally”关键字可以省略,但是finally关键字可以在我们后续学习IO流和跟资源相关的东西之类的时候可以利用finally关键字来进行关闭。
- 若需要捕获多个异常,只需要多添加几个catch即可,但是catch括号内的类型的级别不能从大到小,但是可以从小到大。
自定义异常
-
上述两个例子都是JAVA里面内置的拥有的异常类,通常情况下这些异常类可以应对我们生活中的大部分事物。但是还有一种异常时用户可以自定义的,在自定义异常的时候只需要继承Exception类即可。
-
用户在程序中使用自己定义的异常类大体可以分为以下几个步骤:
1. 创建自定义异常类。 2. 在方法中通过throw关键字抛出异常对象 3. 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。 4. 在出现异常方法的调用者中捕获并处理异常。
代码例子:
package Demo03;
//自定义异常类
public class OwnException extends Exception{
private int detail;
public OwnException(int a){
this.detail=a;
}
//toString用于对异常信息的打印
@Override
public String toString(){
return "OwnException{"+"detail="+detail+"}";
}
}
public class Test {
//书写一个可能存在异常的代码块
static void test(int a) throws OwnException{
System.out.println("传递的参数为"+a); //传递一个参数a
if(a>10){
throw new OwnException(a); //此处可以选择捕获或者抛出异常,我这里选择的是抛出
}
System.out.println("it is fine"); //如果没有出现异常则输出 it is fine 此句
}
public static void main(String[] args){
try{
test(1); //在main方法中运行test,此处a=1,不会触发异常
}catch(OwnException e){
//此处还可以添加一些处理异常的代码
System.out.println("OwnException>>"+e); //捕获异常并输出异常
}
}
}
/*
输出内容为:
it is fine
*/
对实际应用的总结:
- 在处理运行时异常时,采用逻辑去合理规避的同时用try-catch来辅以处理
- 在多重catch后面可以多添加一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以用try-catch来处理不清楚的异常
- 对于异常要进行处理,切忌只是一味地调用printStackTrace()去打印输出
- 不同的业务有不同的处理异常的方法
- 在try-catch最后最好添加finally来释放程序占用的资源