Java中的异常

Java中的异常

一、异常的定义

在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。

在Java中,把各种异常现象进行了抽象形成了异常类。

二、异常的分类

  • 异常主要分为一般性异常(编译时异常)非受控异常(运行时异常)
  • 一般性异常(编译时异常):
写代码的时候,编译时报错的异常,就是编译时异常
在编译时期就会检查,如果没有处理异常则编译失败。
  • 非受控异常(运行时异常):
写代码的时候,编译时没有报错的异常,就是运行时异常(RuntimeException)
在运行时期检查异常,在编译时期,运行异常不会报错。

三、异常的处理

1、编译时异常的处理

  1. 上抛(声明异常)
  • 关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。
  • 上一个也可以继续上抛,一直抛到main方法上。main方法再上抛就会抛给JVM,JVM就会中断运行。
  • 对于编译时异常,一直上抛,说明只是把问题抛给了更高一级,并没有实实在在的处理它。
修饰符 返回值类型 方法名(参数列表) throws 异常类名…{   }
例:
public void m() throws FileNotFoundException{    }
  1. 捕获异常
  • 一旦异常发生,可以上抛,但是在没有到达main方法之前,最好捕捉并处理,不要将这些异常交给JVM自动处理。
  • Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
编译时异常一定要捕获,一定要处理,如果不做任何处理,编译过不了。
如果一味上抛,一旦出现问题,JVM会终止运行。
异常一旦发生且被捕获之后,程序是不会终止运行的。
try..catch不能避免异常,只能确保异常发生以后,程序还能正常运行,
但是在try代码块中,异常发生之后,这个异常所在位置之后的代码都将不会执行。
try{}catch(){}

try作用域中的所定义的变量,出了这个作用域便失效
如果try语句块中没有要处理的异常信息,catch是一个可以省略的,但是不建议省略。
try只会在有异常发生的情况下才会出现。
catch()中的()的内容是异常类变量
try中包含了可能产生异常的代码
try后面是catchcatch可以有一个或多个,catch中是需要捕获的异常
当try中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch语句块中,如果没有异常不会跳转到catch
try {
	
	} catch (OneException e) {
	
	} catch (TwoException e) {
	
	} 
	
例:
try {
	  	 FileInputStream fis = new FileInputStream("test.txt");
	     fis.close();
	} catch (IOException e) {
	     e.printStackTrace();
	} catch (FileNotFoundException e) {
	     e.printStackTrace();
	}
	
	以上代码分析:
将IOException放到前面,会出现编译问题
因为IOExceptionFileNotFoundException的父类,所以截获了IOException异常后,IOException的子异常都不会执行到
所以再次截获FileNotFoundException没有任何意义

异常的截获一般按照由小到大的顺序,也就是先截获子异常,再截获父异常。
正确示例:
	try {
	  	 FileInputStream fis = new FileInputStream("test.txt");
	     fis.close();
	} catch (FileNotFoundException e) {
	     e.printStackTrace();
	} catch (IOException e) {
	     e.printStackTrace();
	}

2、运行时异常的处理

运行时异常不需要预处理,通过规范的代码可以避免产生这种异常

四、堆栈追踪信息

e.printStackTrace()这个方法是异常中最重要的一个方法。
一般都使用这个方法,这个方法出现在catch语句块中。

打印样例:
com.MyException.MyException
	at com.myJava.A.My.check(My.java:12)
	at com.myJava.A.Test6.main(Test6.java:9)

五、手动抛异常(自定义异常)

class 自定义异常类 extends Exception {
	成员属性String类型
	无参构造;
	有参构造;
}
注意:只能继承Exception,不能继承RuntimeException

自定义异常:

package com.MyException;

public class MyException extends Exception {
    private String message;


    public MyException() {

    }

    public MyException(String message) {
        this.message = message;
    }
}

手动抛异常:

package com.myJava.A;

import com.MyException.MyException;

public class My {
    public void check(Object object)throws MyException {
        if(object instanceof Integer) {
            System.out.println("合理的整数");
        }
        else {
            MyException myException = new MyException();
            throw new MyException("不是合理的整数");
        }
    }
}

测试类:

package com.myJava.A;

import com.MyException.MyException;

public class Test6 {
    public static void main(String[] args) {
        My my = new My();
        try {
            my.check("123456");
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}

测试结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值