Day10基础不牢地动山摇?Java基础( 二 )
可以发现,以上的程序实际上是存在三种异常,而程序之中只能处理一种,而对于不能处理的异常,发现程序依然会直接中断执行 。
public class TestDemo2{ public static void main(String args[]){System.out.println("1,除法程序开始");try{int x = Integer.parseInt(args[0]); //接收参数int y = Integer.parseInt(args[1]);//接收参数int result = x/y;System.out.println("2,除法程序结果:"+result);}catch(ArithmeticException e){e.printStackTrace();}catch(ArrayIndexOutOfBoundsException e){e.printStackTrace();}catch(NumberFormatException e){e.printStackTrace();}finally{System.out.println("不管是否异常都会执行");}System.out.println("3,除法程序结束"); }}
此时,问题就来了,如果按照以上的方式一次一次的测试来进行异常类型的推断,还不如直接编写if…else 。
1.2 异常处理的流程以上已经完成了异常的基本处理流程,但是也可以发现问题,所有的异常都像之前那样一条条的判断似乎是一件不可能完成的任务,因为以后肯定会接触到一些不常见的异常信息,那么下面就必须首先研究异常的流程和结构 。
首先查看两个异常的继承结构
ArithmeticExceptionjava.lang.Objectjava.lang.Throwablejava.lang.Exception java.lang.RuntimeExceptionjava.lang.ArithmeticExceptionArrayIndexOutOfBoundsExceptionjava.lang.Objectjava.lang.Throwablejava.lang.Exceptionjava.lang.RuntimeExceptionjava.lang.IndexOutOfBoundsExceptionjava.lang.ArrayIndexOutOfBoundsException
可以发现所有的异常类型最高的继承类是Throwable,通过doc文档可以发现Throwable下有两个子类:
Error:指的是JVM错误,这个时候的程序并没有执行,无法处理;
Exception:指的是程序之中出现了错误信息,可以进行异常处理,主要关心Exception 。
那么通过继承关系可以发现,肯定在进行日常处理的时候是以Exception为主,而这个时候就可以形成以下的异常处理流程 。
1.3 throw关键字throws关键字主要是在方法定义上使用的,表示的是此方法之中不进行异常处理,而交给被调用处处理 。
class MyMath{//现在的p()方法之中抛了一个异常出来,表示的是,所有的异常交给被调用处进行处理 。public int p(int x,int y) throws Exception{returnx/y; }}public class TestDemo3{ public static void main(String args[]){try{System.out.println(new MyMath().p(10,0));}catch(Exception e){e.printStackTrace();} }}
在调用throws声明方法的时候,一定要使用异常处理操作进行异常的处理,这是是属于强制性的处理,而现在主方法本身也属于方法,那么实际上在主方法上也可以继续使用throws进行异常的抛出 。
class MyMath{//现在的p()方法之中抛了一个异常出来,表示的是,所有的异常交给被调用处进行处理 。public int p(int x,int y) throws Exception{returnx/y; }}public class TestDemo3{ public static void main(String args[]) throws Exception{try{System.out.println(new MyMath().p(10,0));}catch(Exception e){e.printStackTrace();} }}
这个时候表示的是将异常继续向上抛,交给JVM进行异常的处理 。
请解释throw和throws区别?
throw用于方法内部表示进行手工的抛出throws主要用于方法声明上使用,明确的告诉本方法可能产生的异常,同时该方法可能不处理异常 。
1.4 异常处理模型现在觉得有两个内容实在没用finally,throw 。
现在要求定义一个p()方法,而这个方法有如下一些要求:
在进行除法操作之前,输出一行提示信息 。
在除法操作执行完毕后,输出一行提示信息 。
如果中间产生了异常,则应该交给被调用处来进行处理 。
class MyMath{ public static int p(int x, int y) throws Exception{int result = 0;//不写catch语句的执行流程//首先进行try代码块的执行后执行finally代码块执行完成后执行//throws进行异常捕获,捕获完成后再主方法catch语句中进行执行try{System.out.println("before进行除法计算");result = x / y;}finally{System.out.println("after进行除法计算");}return result; }}public class TestDemo4{ public static void main(String args[]){try{System.out.println(MyMath.p(10,0));}catch(Exception e){e.printStackTrace();} }}
1.5 RuntimeExceptionpublic class TestDemo4{ public static void main(String args[]){String str = "123";int num = Integer.parseInt(str);System.out.println(num*num); }}
这个方法就是将一个字符串变为了基本数据类型,而后执行乘法操作,但是下面来看一下parseInt()方法的定义:
Public static int parseInt(String s) throws NumberFomatException
发现这个方法上抛出了一个NumberFomatException的异常,按照之前所讲,如果存在了throw,则必须使用try….catch进行处理,可是现在去没有强制要求处理,来观察一下NumberFomatException的继承结构 。
推荐阅读
- 花边的常用材料有哪些
- 养羊成本 养羊需要什么基础条件?
- 美术技法 美术基础理论知识
- 三基是指哪三基
- 原神武器池多少发保底
- lo裙有哪些基础知识-生活百科知识
- 乳液和面霜的区别
- 地台电视柜怎么做的
- 面霜什么时候用
- 基础补水和深层补水区别
