今天就来说说java的异常处理机制,异常处理不是第一接触,尤其是写过很多c#的代码,基本都会写到异常处理的代码,其实c#的异常处理与java的异常处理基本都是一样的,只是在一些细节上不是很一样。今天就来说说关于Java的异常处理机制。
一、为什么需要
1、原因很简单就是错误是无法避免的,为什么这么说:我们的程序都是需要与外界交互的,但是外界环境是没有办法控制的,例如要访问的文件不存在,突然网络中断,或者操作失误等等都在所难免。还有代码是程序员写出来的,有bug也在情理之中。
2、异常无法避免,但是一个好的系统不能再遇到异常的时候就瘫痪吧?!我们需要对用户提出友好的提示,并且对用户的操作进行保存。这样异常处理就是非常必要的了。
首先说道异常,我们都知道在写程序的时候异常在所难免,但是这些异常都是怎么造成的呢?!总结发现异常一般是由用户错误引起,程序错误引起,物理错误引起。
二、优势
1、传统的方法会将很多精力用在错误处理上,如果用异常处理我们可以先完成正常的流程,再对异常进行捕捉处理
2、传统的方法正常流程和异常混在一起,而异常处理则是互相独立的,增强了代码的可读性。
3、传统的方法使用分支语句来处理错误,增加了代码的复杂性,如果用异常处理的方法则对异常类型进行分类型分组别进行处理简单明了
4、传统的方法只能对考虑到的错误进行处理,对无法预测的错误没有应对措施,如果用异常处理的方式则对各种异常都能进行处理
三、分类
1、Throwable(java.lang.Throwable):在API文档中写到:Throwable
类是 Java
语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java
虚拟机或者Java throw
语句抛出。类似地,只有此类或其子类之一才可以是 catch
子句中的参数类型。
2、Error(java.lang.Error):我们都知道是错误的意思,用于指示合理的应用程序不应该试图捕获的严重问题
3、Exception(java.lang.Exception):异常是指程序本身可以处理的异常
4、RuntimeException(java.lang.RuntimeException)(运行时异常):可能在java虚拟机正常运行期间抛出的异常超类。这种异常是可以通过改进代码来避免的。
5、非运行时异常(编译异常):是runtimeException以外的异常,从程序的角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。例如:sqlException以及自定义的Exception异常。
四、异常机制
在java中两种方法处理异常:捕捉异常,抛出异常。
1、捕捉异常:
使用try...catch捕获异常并处理,多个catch语句用来匹配多个异常,如:
代码如下:
package com.tgb.pattern; import javax.swing.JOptionPane; public class Demo { public static void main(String[] args){ int i=Integer.parseInt(JOptionPane.showInputDialog("请输入一个整数")); JOptionPane.showMessageDialog(null,"输入的整数是:"+ i); } }
如果输入qq就会出现:
调整后:
package com.tgb.pattern; import javax.swing.JOptionPane; public class Demo { public static void main(String[] args){ try{ int i=Integer.parseInt(JOptionPane.showInputDialog("请输入一个整数")); JOptionPane.showMessageDialog(null,"输入的整数是:"+ i); }catch(NumberFormatException nf){ JOptionPane.showMessageDialog(null,nf.getMessage()); } } }
结果为:
这样用户还是没有办法看明白,继续修改:
package com.tgb.pattern; import javax.swing.JOptionPane; public class Demo { public static void main(String[] args){ try{ int i=Integer.parseInt(JOptionPane.showInputDialog("请输入一个整数")); JOptionPane.showMessageDialog(null,"输入的整数是:"+ i); }catch(NumberFormatException nf){ JOptionPane.showMessageDialog(null,"只能输入整数!"); } } }
结果为:
再看一个多个catch的代码:
package com.tgb.pattern; import javax.swing.JOptionPane; public class Demo { public static void main(String[] args){ try{ int i=Integer.parseInt(JOptionPane.showInputDialog("请输入一个整数,范围是0-10:")); JOptionPane.showMessageDialog(null,"输入的数为:" +getIntDigit(i)); }catch(Exception ex){ JOptionPane.showMessageDialog(null,ex.getMessage()); } } static int getIntDigit(int i)throws Exception{ if(i>0 && i<=10){ return i; }else{ throw new Exception("输入数的范围不在0-10之间"); } } }
结果为:
没能不为整数的数据进行异常处理,下面修改一下:
package com.tgb.pattern; import javax.swing.JOptionPane; public class Demo { public static void main(String[] args){ try{ int i=Integer.parseInt(JOptionPane.showInputDialog("请输入一个整数,范围是0-10:")); JOptionPane.showMessageDialog(null,"输入的数为:" +getIntDigit(i)); }catch(NumberFormatException nf){ JOptionPane.showMessageDialog(null, "必须输入整数"); }catch(Exception ex){ JOptionPane.showMessageDialog(null,ex.getMessage()); } } static int getIntDigit(int i)throws Exception{ if(i>0 && i<=10){ return i; }else{ throw new Exception("输入数的范围不在0-10之间"); } } }
结果为:
这样就可以捕获到不同的异常信息并对其进行处理了,其实以上代码的getIntDigit方法中的异常处理就是抛出,并在主方法中进行捕获。所以就不再写关于抛出异常的实例了。
在java的异常处理机制中还有很多不同的java异常处理类,这里没有一一说明,可以在响应的api文档进行查询,当然如果有兴趣也可以在敲代码过程中收集错误信息。很好的利用异常处理可以提高代码的可读性,使的代码更加简洁!