今天就来说说java的异常处理机制,异常处理不是第一接触,尤其是写过非常多c#的代码,基本都会写到异常处理的代码,事实上c#的异常处理与java的异常处理基本都是一样的,仅仅是在一些细节上不是非常一样。
今天就来说说关于Java的异常处理机制。
一、为什么须要
1、原因非常easy就是错误是无法避免的。为什么这么说:我们的程序都是须要与外界交互的。可是外界环境是没有办法控制的。比如要訪问的文件不存在,突然网络中断,或者操作失误等等都在所难免。还有代码是程序猿写出来的,有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文档进行查询。当然假设有兴趣也能够在写程序过程中收集错误信息。非常好的利用异常处理能够提高代码的可读性。使的代码更加简洁!