摘要:在软件开发过程中,任何语言的开发过程都离不开异常处理。本文分享自华为云社区《Java异常处理学习总结》,作者:zekelove。在软件开发过程中,任何语言的开发过程都离不开异常处理。如果不处理异常,将导致软件异常中断、崩溃、退出,严重影响用户的使用和体验。如果异常处理应用得当,可以减少软件错误,友好提示用户,提升用户体验。什么是例外?异常是程序中的一些错误,但并不是所有的错误都是异常,错误有时是可以避免的。例如:用户输入非法数据、除法时除数为0、语句中省略分号、打开的文件不存在、内存溢出、网络中断等异常处理机制允许程序当异常发生时,根据代码预先设定的异常处理逻辑,有针对性地处理异常,使程序尽可能恢复正常并继续执行,同时保持代码清晰。异常类型Java中所有的异常类都是从java.lang.Exception类继承而来的子类。Exception类是Throwable类的子类。除了Exception类,Throwable还有一个子类Error。Checkedexceptions:由用户错误或问题引起的,程序员无法预见的异常。除Error和RuntimeException之外的其他异常。运行时异常:运行时异常是程序员可以避免的异常。Error和RuntimeException及其子类。错误:错误不是异常,而是程序员无法控制的问题。通常的做法是通知用户并中止程序的执行。常见异常输入输出异常:IOException算术异常类:ArithmeticExecption空指针异常类:NullPointerException类型强制异常:ClassCastException文件未找到异常:FileNotFoundException数组下标越界异常:ArrayIndexOutOfBoundsException数组负下标异常:NegativeArrayException文件已结束异常:EOFException字符串转数字异常:NumberFormatExceptionMethodnotfound异常:NoSuchMethodException操作数据库异常:SQLException常用异常方法getMessage:获取异常的详细信息。toString:使用getMessage()的结果返回类的字符串名称。printStackTrace:错误输出流。检查异常处理的异常处理方法:使用try...catch...finally块处理;在函数定义中使用throws语句。语法:try{//将可能导致异常的代码放在try块中。}catch(ArithmeticExceptionarithexception){//1.每个catch块用于捕获和处理特定的异常,或者异常类型的子类。//2.异常类型和异常参数定义在catch后的括号内。//3.在catch块中,可以通过该块的exception参数获取异常信息。//4.如果try块中发生的异常没有被任何catch捕捉到,则执行finally,然后再到这个函数的外部调用者去匹配异常处理器。//5.如果try没有异常发生,则不会执行所有的catch块。}catch(Exceptionexception){//捕获异常}finally{//1.finally块是可选的。//2.无论是否发生异常,finally都会执行。//3.一个try必须至少有一个catch块,或者至少有一个finally块。//4.finally块主要做一些关闭和清理工作,比如关闭文件,关闭数据库连接等。示例包com.exception;publicclasstest{publicstaticvoidmain(String[]args){//TODO自动生成的方法存根compute();}publicstaticvoidcompute(){try{doublenum=10/0;System.out.println(num);}catch(ArithmeticExceptionexp){System.out.println(exp.getMessage().toString());}finally{System.out.println("执行finally块");}}}关键字throws/throw如果一个方法没有捕获到checkedexception,那么这个方法必须使用throws关键字声明,throws关键字放在定义的方法的末尾。也可以使用throw关键字抛出异常,无论它是新实例化的还是刚刚捕获的。throws语法:修饰符返回值类型方法名(参数)throws异常类名1,异常类名2,...{codeblock}packagecom.exception;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;publicclasstest{publicstaticvoidmain(String[]args)throwsFileNotFoundException{//TODO自动生成的方法存根readFile();}publicstaticvoidreadFile()throwsFileNotFoundException{InputStreamfile=newFileInputStream("E:/test.txt");}}throw语法:thrownewxxxException();其中xxxException必须是Exception的派生类。注意:throw会产生一个异常对象,所以new不能省略。自定义异常除了JDK定义的异常类外,我们还可以根据自己的业务情况自定义异常处理类。编写自定义异常类的注意事项:1、所有的异常都必须是Throwable的子类。2、如果写了checkedexception类,需要继承Exception类。3、如果写了运行时异常类,需要继承RuntimeException类。语法:修饰符class类名extendsException{codeblock}packagecom.exception;/***自定义异常类*登录失败异常信息类*/publicclassLoginFailExceptionextendsRuntimeException{publicLoginFailException(){super();}publicLoginFailException(Stringmessage){super(message);}publicvoidprintStackTrace(){//覆盖super.printStackTrace();System.out.printf("这是一个LoginFailException异常\n");}}publicclasstest{publicstaticvoidmain(String[]args){//TODO自动生成的方法存根BooleanisLogin=false;if(!isLogin){//登录失败,抛出异常thrownewLoginFailException("Loginisfail");}}}点击关注,第一时间了解华为云的新鲜技术~
