Java的异常
最主要是java运行期的错误。程序时调出来的。
数组:在内存空间中分配n个空间,装有每个值。(int[] arr = (1,2,3)每个空间有他的编号<0格=1,1格=2,2格=3>;输出arr[0]<结果输出值为1>)
Java和c,c++不同,java会检查数组(下标)的越界,c和c++需要自己检查(否则产生缓冲区漏洞)<exception:越界,逻辑错误>
设计良好的程序应该在异常发生时提供处理这些错误的方法(将java的报错转换成正常语言语言,以便可以有处理错误的方法,让普通人能理解<说一些有好的东西>)。
Java程序运行过程中如果发生一些异常事件,java会自动生成一个异常类对象。异常类对象封装了异常事件的信息,并将其提交给java运行时系统,这个过程叫做抛出(throw)异常(某一句抛出异常)。
Java运行时默认信息,是直接打印异常类对象的信息。
当java运行时系统接收到异常对象时,会寻能处理这一异常代码的并把当前异常对象交给其处理,这一过程叫做捕获(catch)异常。
Try catch关键字
Try{System.out.println(2/0);}<请尝试执行>catch()<可能抛出什么样的异常>;{System.out.println(“系统正在维护中,请与管理员联系”);
ae.printStackTrace()<打印对战信息【这个错误怎么引起的,哪一行引起的给程序员一个调试的提示,往往把他打印出来】>}(当出现异常,异常封装到里面,相当于传递了一个对象给了catch这个方法<其实不是方法>)[当出现异常,对象自动被初始化](注意ae是自定义异常的对象,其初始化由系统完成<产生错误时完成>)
java运行时当出现错误时先开有没有catch处理它,没有就直接抛出打印他。
想用catch必须用try。
一个类定义一种方法时往往会注明其可能会抛出什么样的异常。可以指明其可能抛出什么样的异常,使用throw关键字。
Jdk中定义了许多异常类,对应了各种各样的可能出现的异常事件,这些异常事件有个根类——Throwable类(不是一个类,也不是一个接口,也不是一个exception)其下两个子类(error,exception 前者是系统出错<处理不了>,后者是可以解决的,其中还有一类Runtime Exception旗下还有许多类,除了runtime其他类必须逮)。
Runtime Exception是经常出的错误,可以不逮它(直接略过,这样运行效率更高)<只不过运行出错>,若某个方法 throw了某个exception,必须逮它.
ArithmeticException有个构造方法(api文档中),可以输出输入结果。
在定义方法时void
m(int i)throws ArithmeticException{if (i==0)throw new ArithmeticException(“被除数为0”)}
异常必须得逮的异常:FileInputStream Io包里的一个类,用来读文件
FileInputStream in=null;
Try{in =new FileInputStream(“mylife.txt”)
Int b;
B=in.read();
While (b!=1) {
System.out.println((char)b);}
Catch (FileInputStreamException a){
a. printStackTrace()
}catch (IOException a){
System.out.println(a.getMessage ());
}finally {
Try {in.close();
}catch (IOException e){
E.printSTackTrace();
}
}
}
通过一个try去catch多个exception去完成不同的错误报告,方便程序员修复程序Exception。
Finally关键字<无论是否产生某种Exception>
Try里有多个语句,若第一个语句出错,第二个语句及接下来语句不再执行,但下一个try会继续执行,跟在try后面的finally一定会被执行,无论如何都需要执行。(用来关上一定需要关闭的文件,否则出现异常无法关闭)即使没有出现任何错误,catch语句全被略过,finally一样会被执行<进行资源的清除工作>
Try{}catch(){}catch(){}catch(){}…finally{}-执行下面语句
异常的捕获和处理
在catch中封装了,异常事件发生的信息,在catch语句块中可以用这个对象的一些方法来来获取这些信息,例如getMessage()方法,用来得到有关异常事件的信息,printStackTrace方法,用来跟踪异常事件发生执行时的堆,栈内容。
Finally,用来清除临时文件,可以更好地运行接下来的语句,使系统维护的比较好。
见具体Exception2
如果java里catch到exception但不能解决,向上抛出Exception即可,用到throws。
当解决不了某种异常(catch住了以后解决不了,只要向上级抛出就行了)
将可能出异常的语句,封装在某个方法中,并注明抛出(抛出的类型)
Void f()throws <抛出错误类型1>,<抛出错误类型2>…{语句}
此时用f2()再封装f()方法,再次抛出或者用try catch对f()抛出的异常做出处理,当然也可以再次抛出 在main方法中也再次抛出写throws Exception(就是这个语句)(交给运行时系统打印Exception)
若已给方法再main方法抛出,还是会执行try catch语句。
程序员处理时第一行往往是你或系统提供给运行出错时显示的信息,之后是某个方法出错(也可以是main方法出错,方法出错后面紧跟的是出错行号<把堆栈信息打印出来>,根据行号,可以改正这些Exception)
注意:如果在之前已经把所有的大的Exception捕捉,再去捕捉属于这个Exception的小类,编译时一定会出错,应该先捕捉小的再捕捉大的。
自定义异常:只需要从某种Exception(也可以是Exception)中继承(注意RuntimeException可以逮也可以不逮,所以从此继承要注意),在方法适当的位置生成自定义异常实例,并用throw语句抛出,在方法的声明部分用throws语句声明该方法可能抛出的异常。
具体方法:定义一个异常,从某一个异常类(Exception or RunTimeException)继承,重写构造方法,写相关方法(编号,抛出怎样的话)
在运行类中定义一个方法可能抛出自定义类型异常,写方法语句(若某一步发生异常,不会继续这个方法,直接抛错)
主方法中运行这个方法,在之前加上try,在之后加上catch 其中逮到的异常类型是自定义异常类型[当然也可以将try catch封装在一个方法中,这个方法肯定不在主方法中,再在主方法中直接对某个对象调用这个方法,来防止对象声明,属性或运行出现异常]
异常与继承之间的关系:继承异常(或者继承类),重写某一个方法(这个方法抛出某一类异常),
其子类若想重写某一个方法,他可以抛出相当于父类同样的异常,或者不抛出任何异常(与父类异常必须完全相同,不可大 ,不可小。)
总结:一张图和五个关键字:老祖宗throwable -error&Exception-RuntimeException&必须处理
五个关键字:Throw,catch,try, throws, finally
先逮小的再逮大的,异常和重写之间的关系。
注意:finally方法在所有方法中都会比return语句先行执行,而且一旦抛出某个方法执行不了的异常后,return语句一定不会执行,但是finally方法仍会执行。