java 字符串异常处理_实验四 字符串和异常处理

【开发语言及实现平台或实验环境】

Windows2000或XP,JDK1.5以上版本与Eclipse集成开发环境

【实验目的】

1.了解Java中字符串和异常处理(exception)的作用。

2.掌握字符串操作、异常处理的设计方法。

【实验要求】

理解系统异常处理的机制和定义异常的方法。

【知识要点】

1.错误与异常

在程序执行期间,会有许多意外的事件发生。例如,程序申请内存时没有申请到、对象还未创建就被使用、死循环等,称为运行错误。根据错误的性质将运行错误分为错误与异常两种类型。

(1)错误

程序进入了死循环或内存溢出,这类现象称为错误或致命性错误。错误只能在编程阶段解决,运行时程序本身无法解决,只能依靠其它程序干预,否则会一直处于一种不正常的状态。

(2)异常

运算时除数为0,或操作数超出数据范围,打开一个文件时发现文件不存在,网络连接中断等等,这类运行错误现象称为异常。对于异常情况,可在源程序中加入异常处理代码,当程序出现异常时,由异常处理代码调整程序运行流程,使程序仍可正常运行直到正常结束。

由于异常是可以检测和处理的,所以产生了相应的异常处理机制。而错误处理一般由系统承担。

对于一个应用软件,异常处理机制是不可缺少的。程序员必须在程序中考虑每一个可能发生的异常情况并进行处理,以保证程序在任何情况下都能正常运行。事实证明,一个仔细设计了异常处理的程序,可以长时间的可靠运行,而不容易发生致命的错误,如程序被迫关闭、甚至系统终止等等。所以学会进行异常情况处理对于想编写功能完善且具有实用价值的程序员来说是必不可少的。

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、当从键盘输入为“good”,显示为“好”,输入其余字符,显示为“不好”。

2、将从键盘输入的字符串倒序打印输出。3、设定一个有大小写字母的字符串和一个查找字符,使用String类的方法indexOf()来判断在该字符串中对应字符出现的次数。

4、写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

5、将字符串中的第m位进行替换,如果是大写字母,则替换为小写字母;如果是小写字母,则替换为大写字母;其他情况,则不变。

6、编写一个应用程序,使用StringBuffer对象实现对字符串的编辑操作,包括:替换字符中的某些字符,删除字符串中的某些字符,在字符串中插入或尾部加入新的字符串,翻转字符串等。

7、接受用户输入的一个字符串和一个字符,把字符串中所有指定的字符删除后输出。

8、整理字符串将前后空白删去。并把中间的多个空白保留一个。

9、(附加问题)编写实现从两字符串找出最长的相同字符序列的代码。

【实验内容2】异常处理

一、使用try…catch语句处理异常

1.异常类型匹配的处理方式

(1)程序功能:首先说明"这是一个异常处理的例子",然后在程序中主动产生一个

ArithmeticException类型被0除的异常,并用catch语句捕获这个异常。最后通过

ArithmeticException类的对象e的方法getMessage给出异常的具体类型并显示出来。

(2)编写使用try…catch语句处理异常的程序文件LX4_6.java,源代码如下。

public class LX4_6{

public static void main(String[] arg3) {

System.out.println("这是一个异常处理的例子"n");

try {

int i=10;

i /=0;

}catch (ArithmeticException e) {

System.out.println("异常是:"+e.getMessage());

}

finally {

System.out.println("finally语句被执行");

}

}

}

(3)编译并运行程序,结果如图4.7所示。

注意:如果在catch语句中声明的异常类是Exception,catch语句也能正确地捕获,这是因为Exception是ArithmeticException的父类。如果不能确定会发生哪种情况的异常,那么最好指定catch的参数为Exception,即说明异常的类型为Exception。

2.异常类型不匹配的程序

(1)编写一个catch语句中声明的异常类型不匹配的程序LX4_7.java,源代码如下。

public class LX4_7{

public static void main(String[] args) {

System.out.println(“这是一个异常处理的例子"n”);

try {

int i=10;

i /=0;

}

catch (IndexOutOfBoundsException e) {

System.out.println("异常是:"+e.getMessage());

}

finally {

System.out.println("finally语句被执行");

}

}

}

(2)编译并运行程序LX4_7,结果如图4.8所示。

因为LX4_7程序试图捕获一个异常类为IndexOutOfBoundsException的异常,但发生的异常却是ArithmeticException类,所以,程序可以通过编译但在运行时,系统会给出异常报告:报告所发生的但没有被捕获的异常。不过在此之前,其它语句和finally语句将会被执行。

3.包含多个catch子句的异常处理程序

(1)程序功能:在try子句中设计两个可能出现的异常,当a为0时会发生异常。另外一个是肯定的异常,因为数组c的长度为1,定义c[42]是为法的。通过两个catch子句分别来捕获异常。

(2)编写包含多个catch子句的LX4_8.java程序,源代码如下。

public class LX4_8{

public static void main(String[] args) {

try {

int a=args.length;

System.out.println(""na = "+a);

int b=42/a;

int c[]={1};

c[42]=99;

}

catch (ArithmeticException e) {

System.out.println("发生了被0除:"+e);

}

catch (ArrayIndexOutOfBoundsException e) {

System.out.println("数组下标越界:"+e);

}

}

}

(3)实验下面两种情况:

1)在程序运行时不输入参数,则args.length的值为0,这将引起一个被0除异常。其结果如图4.9所示。

2)在运行程序时,输入22,将不会引起被0除异常,但会引起一另一个异常即数组下标越界ArrayIndexOutOfBoundsException。因为整型数组只有一个元素c[0],程序中却要

使用c[42],这将发生数组下标越界。运行结果如图4.10所示。

二、使用throw语句抛出异常

1.throw语句的作用

在上面的实验中,可以发现,异常对象是Java运行时由系统抛出的。抛出异常也可以通过使用throw语句实现。throw是Java语言的关键字,用来告知编译器此处要发生一个异常。throw后面要跟一个新创建的异常类对象,用于指出异常的名称和类型。

throw语句格式为: ;

程序会在throw语句处立即终止,转向try…catch寻找异常处理方法,不再执行throw后面的语句。

2.throw语句的使用

(1)编写带有throw语句的程序TC5.java,源代码如下。

public class LX4_9 {

static void throwProcess() {

try {

throw new NullPointerException("空指针异常");

}

catch (NullPointerException e) {

System.out.println(""n在throwProcess方法中捕获一个"+e.getMessage());

throw e;

}

}

public static void main(String args[]) {

try {

throwProcess();

}

catch (NullPointerException e) {

System.out.println("再次捕获:"+e);

}

}

}

(2)编译并运行程序,结果如图4.11所示。

(3)程序执行流程

程序首先调用throwProcess方法,明确地抛出了一个NullPointerException异常并将其命名为“空指针异常”。然后程序流程将转向throwProcess方法中的catch子句,输出一条信息。throwProcess方法的catch子句又抛出了一个同样的异常e。然后结束throwProcess方法的调用,执行main方法中的catch子句,再次捕获这个异常。

三、使用throws子句

1.throws子句的作用

throws子句一般用来表明在使用该方法时可能抛出异常但不捕获的异常。异常由系统来处理。

throws子句也可以指出抛出异常是RuntimeException或自定义异常类,即异常的类型,以便准备调用其它方法捕获它,这种情况一般需要两个方法来分别处理抛出异常和处理异常。

2.只是在方法中抛出异常的程序

对于程序中无法处理的异常,可以使用throws子句在方法中抛出异常交由系统处理。

(1)程序功能:在程序中打开文件a3.txt,因为该文件可能不存在或路径不对,所以存在IOException类型异常的可能,因此这里使用throws来抛出异常。

(2)编写只是抛出异常的程序文件LX4_10.java,源代码如下。

import java.io.*;

public class LX4_10

{

public static void main (String args[]) throws IOException

{

FileInputStream fis = new FileInputStream("a3.txt");

}

}

(3)编译并运行程序,如果该文件在当前目录中不存在,将由系统自动给出异常报告,如图4.12所示。

3.带有捕获处理的throws子句

(1)程序功能:在这个程序中的mathod方法中使用throws子句抛出异常,在main方法中捕获处理异常。

(2)TC6.java,源代码如下。

import java.io.*;

public class LX4_11{

static void mathod() throws IllegalAccessException {

System.out.println(""n在mathod中抛出一个异常");

throw new IllegalAccessException();

}

public static void main(String args[]) {

try {

mathod();

}catch (IllegalAccessException e) {

System.out.println("在main中捕获异常:"+e);}

}

}

(3)编译并运行程序,结果如图4.13所示。

四、使用finally子句

1.finally子句的作用

当一个异常被抛出时,程序的执行流程就不再是连续的了,会跳过某些语句,甚至会由于没有与之匹配的catch子句而过早地返回,结束程序的运行。为了确保一段代码不管发生什么异常都能被执行,可以使用finally子句。每个try语句至少都要有一个与之相配的catch或finally子句。

从一个方法中返回到调用它的另外一个方法,可以通过return语句或通过一个没有被捕获的异常,但finally子句总是在返回前被执行。

2.创建使用finally子句的程序文件LX4_12.java。

(1)程序功能:在类LX4_12的mathodA方法中使用try子句捕获异常,使用finally子句处理异常。在类LX4_11的main方法中使用try子句捕获mathodA异常,

(2)编写LX4_12.java程序,源代码如下。

class LX4_12{

static void mathodA() {

try {

System.out.println(""nmathodA抛出一个异常");

throw new RuntimeException();

}finally {

System.out.println("执行mathodA的finally");}

}

static void mathodB() {

try{

System.out.println("mathodB正常返回");

return;

}finally {

System.out.println("执行mathodB的finally");}

}

public static void main(String args[]) {

try {

mathodA();

} catch (Exception e) {

mathodB(); }

}

}

(3)编译并运行该程序,结果如图4.14所示。

【思考题】

什么是异常?异常处理机制有什么作用?异常处理有哪些方式。

posted on 2010-04-15 14:38 libifeng 阅读(1487) 评论(0)  编辑  收藏 所属分类: Java实验指导书

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的异常是指在程序运行过程中出现的错误或异常情况。Java提供了一些内置的异常类,如NullPointerException、ArrayIndexOutOfBoundsException等。除此之外,Java还允许用户自定义异常类来处理特定的异常情况。 自定义异常类需要继承自Exception或其子类,通常包含以下几个部分: 1. 构造方法:用于创建异常对象。 2. getMessage()方法:用于获取异常信息。 3. toString()方法:用于返回异常字符串表示形式。 下面是一个简单的自定义异常类的示例: ``` public class MyException extends Exception { public MyException(String message) { super(message); } @Override public String getMessage() { return "MyException: " + super.getMessage(); } @Override public String toString() { return "MyException: " + super.getMessage(); } } ``` 在上面的示例中,我们定义了一个名为MyException的自定义异常类,它继承自Exception类。该类包含一个构造方法,用于创建异常对象,并重写了getMessage()和toString()方法,以便获取异常信息和返回异常字符串表示形式。 使用自定义异常类时,可以像使用内置异常类一样使用它。例如: ``` public class Test { public static void main(String[] args) { try { throw new MyException("This is my exception."); } catch (MyException e) { System.out.println(e.getMessage()); System.out.println(e.toString()); } } } ``` 在上面的示例中,我们在try块中抛出了一个MyException异常,并在catch块中捕获并处理该异常。输出结果为: ``` MyException: This is my exception. MyException: This is my exception. ``` 这说明我们成功地创建了一个自定义异常类,并成功地使用它来处理异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值