异常,我们软件都需要面对的一个问题。如何让你的软件更加健壮呢?这是一个值得我们考虑的问题。这里主要为大家介绍一下异常是什么,异常是如何产生的,如何将异常抛出,如何捕获异常,对于异常应该如何处理的个人一些见解。
异常是什么
单就异常这两个字来说,异常的意思是:1.非正常的;不同于平常的异常现象。在我们代码中,异常指的是,在程序运行时,出现一些不正常的情况,使我们的程序无法正常运行或者对操作系统造成影响,使我们的程序无法得到预期的结果。这就是异常。这里需要说的是,我们的异常,指的是程序在运行时出现的一些问题,比如说你写了一个除法运算,用户将除数设置为了0,那么系统就会抛出异常。
异常是如何产生的
异常产生的原因有很多,比如:除数为零,数组下标越界,读取的文件不存在等,字符类型做运算处理等,这里有很多都是逻辑上的异常。可能是用户输入了一些不合法的数据,但是没有相应的检查机制,于是进行了一些不正常的操作,导致产生了异常。
异常出现后,程序可以生成一个异常类型的对象,这是系统生成的异常,这就是异常的生成。异常生成后会将异常交给java的运行系统,这是异常的抛出,具体实现下文会有介绍。现在先跟大家分享下编程人员如何自己从代码里生成异常吧,异常生成代码如下:
//生成异常的方法 void m(int i ) throws ArithmeticException { if (i==0) { //生成异常的代码 throw new ArithmeticException ("被除数为零"); }
}这里的这个方法,当你调用的时候,如果将i传入0 ,那么,就会生成一个异常,并且返回给调用它的类。
异常如何抛出
//抛异常的类,这里的主函数调用f类,然后通过f类调用m类,这时,m类将异常抛给f类,然后f类将异常接着抛给了主函数。 void f(int i) throws ArithmeticException { //调用m类 m(i); } //生成异常的方法 void m(int i ) throws ArithmeticException { if (i==0) { //生成异常的代码 throw new ArithmeticException ("被除数为零"); } }在这里,我们的f类调用了可以生成异常的m类,但是它并没有将m类抛给它的异常解决,而是通过 throws ArithmeticExeption 这个方法,将异常再次抛出,抛给了调用它的类。
如果调用它的类还是不想或者是不能解决该异常,可以继续用同样的方法将异常抛出。
如何捕获异常
异常如何被捕获呢?先向大家展示一段代码:public class TestEx { public static void main (String[] args) { int[] arr = {1,2,3}; System.out.println(arr[2]); //异常的处理机制 try { //有可能出问题的代码 System.out.println(2/0) ; } //捕捉异常 catch (ArithmeticException ae) { //返回信息,如果出异常后会执行这块的内容 System.out.println("系统出异常了,请联系管理员"); ae.printStackTrace(); } } }
在这里,我们的软件在运行时,自动生成了一个除数为0 的异常,我们在有可能发生异常的地方写一个try {}catch{}然后将有可能出现异常的代码写入try的括号中,将异常出现后的处理方法写入catch的括号中,如果出现异常的话,程序就可以按照设计人员的想法将异常处理,这样的话,可能就不会再将系统中断,这是异常的好处。
下面是我们之前说的那个抛出的异常的捕获和处理:感兴趣的小伙伴可以看一下。
public class TestEx { public static void main (String[] args) { try { new TestEx().f(0); } catch (ArithmeticException ae) { ae.printStackTrace(); System.out.println("这是一个抛出了的异常!"); } }
异常处理
软件出异常是很正常的事,如何将异常捕获并处理这是需要我们考虑的,不是所有异常都是需要用户知情,需要用户知情的也不一定所有异常都要终止软件运行。如何 让软件更加的健壮、人性化。这是设计人员需要考虑的。
我们可以用多个catch语句去捕捉异常,对于不同的异常提供不同的解决方案,但是需要注意的是:如果异常类有继承关系的话,要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch块可能被执行,否则子类型的catch块将永远无法到达,Java编译器会报错。