字符串和异常处理文档格式.docx
- 文档编号:19849640
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:10
- 大小:19.95KB
字符串和异常处理文档格式.docx
《字符串和异常处理文档格式.docx》由会员分享,可在线阅读,更多相关《字符串和异常处理文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
2.异常发生的原因
(1)Java虚拟机检测到了非正常的执行状态,这些状态可能是由以下几种情况引起的:
·
表达式的计算违反了Java语言的语义,例如整数被0除。
在载入或链接Java程序时出错。
超出了某些资源限制,例如使用了太多的内存。
(2)Java程序代码中的throw语句被执行。
(3)异步异常发生。
异步异常的原因可能有:
Thread的stop方法被调用。
Java虚拟机内部错误发生。
3.异常处理机制
发生异常后,怎么处理异常呢?
Java提供了异常处理机制来处理异常。
分为两个步骤:
(1)抛出异常
Java是这样规定的:
当语义限制被违反时,将会抛出(throw)异常,即产生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常。
一个异常对象可以由Java虚拟机来产生,也可以由运行的方法生成。
异常对象中包含了异常事件类型、程序运行状态等必要信息。
(2)捕获异常
异常抛出后,运行时系统从生成异常对象的代码开始,沿方法的调用栈进行查找,直到找到包含相应处理的方法代码,并把异常对象交给该方法为止,这个过程称为捕获(catch)异常。
简单说异常处理机制就是:
当语义限制被违反时,将会抛出异常对象,并将引起程序流程从异常发生点转移到程序员指定的处理异常方法代码处进行异常处理。
4.了解异常对象的类型
在异常发生后,系统会产生一个异常事件,生成一个异常对象,有哪些异常对象呢?
这些异常对象来自哪些类呢?
Java中的异常类具有层次结构组织。
其中,Throwable类是Error错误类和Exception异常类的父类,它是Object的直接子类。
RuntimeException运行时异常类是Exception异常类的子类。
如图所示。
1.Exception异常类的子类
(1)RuntimeException运行时异常类,主要包括以下异常子类:
ArithmeticException算术异常类:
表示遇到了异常的算术问题,例如被0整除。
ArrayStoreException数组下标越界异常类:
试图把与数组类型不相符的值存人数组。
ClassCastException类型强制转换异常类:
试图把一个对象的引用强制转换为不合适的类型。
IndexOutOfBoundsException下标越界异常类:
下标越界。
NullPointerException空指针异常类:
试图使用一个空的对象引用。
SecurityException违背安全原则异常类:
检测到了违反安全的行为。
(2)NoSuchMethodException方法未找到异常
(3)java.awt.AWTException图形界面异常类
(4)java.io.IOException输入输出异常类
IOException:
申请I/O操作没有正常完成。
EOFException:
在输入操作正常结束前遇到了文件结束符。
FileNotFoundException:
在文件系统中,没有找到由文件名字符串指定的文件。
(5)Exception异常类的其它子类
EmptyStackException:
试图访问一个空堆栈中的元素。
NoSuchFieldException:
试图访问一个不存在的域。
NoSuchMethodException:
试图访问不存在的方法。
ClassNotFoundException:
具有指定名字的类或接口没有被发现。
CloneNotSupportedException:
克隆一个没有实现Cloneable接口的类。
IllegalAccessException:
试图用给出了完整的路径信息的字符串加载一个类,但是当前正在执行的方法无法访问指定类,因为该类不是public类型或在另一个包中。
InstantiationException:
试图使用Class的newInstance方法创建一个对象实例,但指定的对象没有被实例化,因为它是一个接口、抽象类或者一个数组。
InterruptedException:
当前的线程正在等待,而另一个线程使用了Thread的interrupt方法中断了当前线程。
2.Error错误类的子类
(1)
VirtualMachineError虚拟机错误
OutOfMemoryError内存溢出错误
StackOverflowError栈溢出错误
(2)
LinkageError链接错误
NoClassDefNotFoundError类定义未找到错误
9、
java.awt.AWTError图形界面错误
【实验内容1】字符串处理
1、将从键盘输入的字符串倒序打印输出。
2、设定一个有大小写字母的字符串和一个查找字符,使用String类的方法indexOf()来判断在该字符串中对应字符出现的次数。
3、写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
4、将字符串中的第m位进行替换,如果是大写字母,则替换为小写字母;
如果是小写字母,则替换为大写字母;
其他情况,则不变。
【实验内容2】异常处理
一、使用try…catch语句处理异常
1.异常类型匹配的处理方式
(1)程序功能:
首先说明"
这是一个异常处理的例子"
然后在程序中主动产生一个
ArithmeticException类型被0除的异常,并用catch语句捕获这个异常。
最后通过
ArithmeticException类的对象e的方法getMessage给出异常的具体类型并显示出来。
(2)编写使用try…catch语句处理异常的程序文件LX4_6.java,源代码如下。
publicclassLX4_6{
publicstaticvoidmain(String[]arg3){
System.out.println("
这是一个异常处理的例子"
n"
);
try{
inti=10;
i/=0;
}catch(ArithmeticExceptione){
异常是:
"
+e.getMessage());
}
finally{
finally语句被执行"
(3)编译并运行程序。
注意:
如果在catch语句中声明的异常类是Exception,catch语句也能正确地捕获,这是因为Exception是ArithmeticException的父类。
如果不能确定会发生哪种情况的异常,那么最好指定catch的参数为Exception,即说明异常的类型为Exception。
2.异常类型不匹配的程序
(1)编写一个catch语句中声明的异常类型不匹配的程序LX4_7.java,源代码如下。
publicclassLX4_7{
publicstaticvoidmain(String[]args){
System.out.println(“这是一个异常处理的例子"
n”);
catch(IndexOutOfBoundsExceptione){
(2)编译并运行程序LX4_7。
因为LX4_7程序试图捕获一个异常类为IndexOutOfBoundsException的异常,但发生的异常却是ArithmeticException类,所以,程序可以通过编译但在运行时,系统会给出异常报告:
报告所发生的但没有被捕获的异常。
不过在此之前,其它语句和finally语句将会被执行。
3.包含多个catch子句的异常处理程序
在try子句中设计两个可能出现的异常,当a为0时会发生异常。
另外一个是肯定的异常,因为数组c的长度为1,定义c[42]是为法的。
通过两个catch子句分别来捕获异常。
(2)编写包含多个catch子句的LX4_8.java程序,源代码如下。
publicclassLX4_8{
inta=args.length;
na="
+a);
intb=42/a;
intc[]={1};
c[42]=99;
catch(ArithmeticExceptione){
发生了被0除:
+e);
catch(ArrayIndexOutOfBoundsExceptione){
数组下标越界:
(3)实验下面两种情况:
1)在程序运行时不输入参数,则args.length的值为0,这将引起一个被0除异常。
其结果如图4.9所示。
2)在运行程序时,输入22,将不会引起被0除异常,但会引起一另一个异常即数组下标越界ArrayIndexOutOfBoundsException。
因为整型数组只有一个元素c[0],程序中却要使用c[42],这将发生数组下标越界。
二、使用throw语句抛出异常
1.throw语句的作用
在上面的实验中,可以发现,异常对象是Java运行时由系统抛出的。
抛出异常也可以通过使用throw语句实现。
throw是Java语言的关键字,用来告知编译器此处要发生一个异常。
throw后面要跟一个新创建的异常类对象,用于指出异常的名称和类型。
throw语句格式为:
<
throw>
<
new>
异常对象名()>
;
程序会在throw语句处立即终止,转向try…catch寻找异常处理方法,不再执行throw后面的语句。
2.throw语句的使用
(1)编写带有throw语句的程序TC5.java,源代码如下。
publicclassLX4_9{
staticvoidthrowProcess(){
thrownewNullPointerException("
空指针异常"
catch(NullPointerExceptione){
n在throwProcess方法中捕获一个"
throwe;
publicstaticvoidmain(Stringargs[]){
throwProcess();
再次捕获:
(2)编译并运行程序。
(3)程序执行流程
程序首先调用throwProcess方法,明确地抛出了一个NullPointerException异常并将其命名为“空指针异常”。
然后程序流程将转向throwProcess方法中的catch子句,输出一条信息。
throwProcess方法的catch子句又抛出了一个同样的异常e。
然后结束throwProcess方法的调用,执行main方法中的catch子句,再次捕获这个异常。
三、使用throws子句
1.throws子句的作用
throws子句一般用来表明在使用该方法时可能抛出异常但不捕获的异常。
异常由系统来处理。
throws子句也可以指出抛出异常是RuntimeException或自定义异常类,即异常的类型,以便准备调用其它方法捕获它,这种情况一般需要两个方法来分别处理抛出异常和处理异常。
2.只是在方法中抛出异常的程序
对于程序中无法处理的异常,可以使用throws子句在方法中抛出异常交由系统处理。
在程序中打开文件a3.txt,因为该文件可能不存在或路径不对,所以存在IOException类型异常的可能,因此这里使用throws来抛出异常。
(2)编写只是抛出异常的程序文件LX4_10.java,源代码如下。
importjava.io.*;
publicclassLX4_10
{
publicstaticvoidmain(Stringargs[])throwsIOException
FileInputStreamfis=newFileInputStream("
a3.txt"
(3)编译并运行程序,如果该文件在当前目录中不存在,将由系统自动给出异常报告。
3.带有捕获处理的throws子句
在这个程序中的mathod方法中使用throws子句抛出异常,在main方法中捕获处理异常。
(2)TC6.java,源代码如下。
publicclassLX4_11{
staticvoidmathod()throwsIllegalAccessException{
n在mathod中抛出一个异常"
thrownewIllegalAccessException();
mathod();
}catch(IllegalAccessExceptione){
在main中捕获异常:
四、使用finally子句
1.finally子句的作用
当一个异常被抛出时,程序的执行流程就不再是连续的了,会跳过某些语句,甚至会由于没有与之匹配的catch子句而过早地返回,结束程序的运行。
为了确保一段代码不管发生什么异常都能被执行,可以使用finally子句。
每个try语句至少都要有一个与之相配的catch或finally子句。
从一个方法中返回到调用它的另外一个方法,可以通过return语句或通过一个没有被捕获的异常,但finally子句总是在返回前被执行。
2.创建使用finally子句的程序文件LX4_12.java。
在类LX4_12的mathodA方法中使用try子句捕获异常,使用finally子句处理异常。
在类LX4_11的main方法中使用try子句捕获mathodA异常,
(2)编写LX4_12.java程序,源代码如下。
classLX4_12{
staticvoidmathodA(){
nmathodA抛出一个异常"
thrownewRuntimeException();
}finally{
执行mathodA的finally"
staticvoidmathodB(){
try{
mathodB正常返回"
return;
执行mathodB的finally"
mathodA();
}catch(Exceptione){
mathodB();
}
(3)编译并运行该程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符串 异常 处理