JAVA程序设计基础第4章异常处理和常用系统类.ppt_第1页
JAVA程序设计基础第4章异常处理和常用系统类.ppt_第2页
JAVA程序设计基础第4章异常处理和常用系统类.ppt_第3页
JAVA程序设计基础第4章异常处理和常用系统类.ppt_第4页
JAVA程序设计基础第4章异常处理和常用系统类.ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章 异常处理和常用系统类 4.1 4.1 异常处理机制异常处理机制 4.2 4.2 StringString类和类和StringBufferStringBuffer 类类 4.3 4.3 AWTAWT 4.4 4.4 Java appletJava applet 4.1 异常处理机制 4.1.1 什么是异常 用任何一种计算机语言设计的程序在 运行时都可能出现各种错误,常见的错误 如除数为0、文件不存在、文件不能打开、 数组下标超过界限、内存不够用等。对于 这种在运行中出现的错误,计算机系统中 通常有两种处理办法。 (1)由计算机系统本身直接检测程 序错误,遇到错误时使程序终止运行。这 种处理方法的优点是使程序设计比较简单 。但是,对程序错误一概地采用终止运行 办法,显然过于简单化。因为有些情况下 ,完全可以通过其他途径保持程序继续运 行。比如,由于文件名不符合要求而无法 打开文件,那么,可以提示用户输入一个 新的文件名,从而使程序继续往下运行。 (2)由程序员在程序设计中兼顾错 误检测、错误信息显示和出错处理。这种 处理方法的优点是减少了中途终止程序运 行的可能性。但是,要求程序员在程序设 计中不仅将精力用于正常处理过程,还要 精心考虑错误检测和处理,这会使程序变 得复杂。并且,这类错误检测往往是多数 程序中重复甚至在一个程序中多次重复。 而另一方面,如果程序中某处忽略了应有 的检测,又将引起程序总体结果的错误。 Java采用异常处理机制来处理程序运 行中的错误。按照这种机制,将程序运行 中的所有错误都看成一种异常,通过对语 句块的检测,一个程序中所有的异常被收 集起来放在程序的某一段中去处理。在 Java系统中,专门设置了一个调用栈,此 栈中装有指向异常处理方法的指针。 在程序运行时,系统会把收集到的异 常和异常处理指针所指的处理类型逐个比 较,如果找到相符的类型,那么就转向相 应的方法处理,如没有在调用栈中找到相 应的类型指针,则终止程序运行,并显示 解释信息。 在Java程序中,异常一般由以下两种原 因引起。 (1)程序中存在非法操作,最简单的 例子就是除数为0的除法操作。这种原因常 常是程序员出于无意或大意造成的,所以 称为隐式异常。常见的隐式异常可以通过 java.lang包中的Throwable类的子类Error 处理。 (2)程序员在程序中使用了throw语 句引起的异常。这种异常是程序员出于某 种考虑有意安排的,所以称为显式异常。 在throw语句中,都会指出处理显式异常的 对象,这些对象都是由java.lang包的类 Throwable的子类Exception再派生的子类 生成的,每个对象完成对某种异常的处理 功能,这些对象综合起来实现各种异常处 理。 比如Array- IndexOutOfBoundsException子类处理数 组越界异常,IOException子类处理输入输 出异常,而ArithmeticException子类处理 除数为0导致的算术异常等。 4.1.2 异常的层次结构 4.1.3 异常的处理 4.1.4 创建自己的异常 4.2 String类和StringBuffer类 4.2.1 String类 1String类的主要构造方法 String类有多个构造方法,主要的有 下列5个: String(); String(char chars ); String(char chars , int startIndex, int numChars); String(byte ascii , int hiByte); String(byte ascii , int hiByte, int startIndex, int numChars); 第1个构造方法生成一个空串。 第2个构造方法生成一个字符数组。 第3个构造方法生成一个字符串,这个 字符串是从字符数组chars 中提取的,具 体讲,即从chars 数组的startIndex位置 开始提取字符,共提取numChars个字符组 成一个字符串。 第4个构造方法是以字节数组的形式生 成一个字符串,数组中存放字符串各字符 对应的ASCII码。 第5个构造方法也是从字节数组生成一 个字符串。具体讲,就是以字节数组ascii 的 startIndex处开始,共提取numChars个 字符构成字符串,如为ASCII 字符,则 hiByte的值为0。 例4-5: import javax.swing.*; public class StringConstructors public static void main( String args ) char charArray = b, i, r, t, h, , d, a, y ; byte byteArray = (byte) n, (byte) e, (byte) w, (byte) , (byte) y, (byte) e, (byte) a, (byte) r ; StringBuffer buffer; String s, s1, s2, s3, s4, s5, s6, s7, output; s = new String( “hello“ ); buffer =new StringBuffer( “Welcome to Java Programming!“ ); s1 = new String(); s2 = new String( s ); s3 = new String( charArray ); s4 = new String( charArray, 6, 3 ); s5 = new String( byteArray, 4, 4 ); s6 = new String( byteArray ); s7 = new String( buffer ); output = “s1 = “ + s1 +“ns2 = “ + s2 + “ns3 = “ + s3 +“ns4 = “ + s4 + “ns5 = “ + s5 +“ns6 = “ + s6 + “ns7 = “ + s7; JOptionPane.showMessageDialog( null, output, “Demonstrating String Class Constructors“, JOptionPane.INFORMATION_MESS AGE ); System.exit( 0 ); 运行结果见图4-5。 图4-5 程序分析:String类提供了9个构造函 数,以便使用各种方法初始化String对象。 例题共演示了7种。 程序“s1 = new String()”实例化一个新 的String对象,并使用String类的缺省构造 函数将它赋给引用s1。新的String对象没有 字符(即空串),长度为0。 “s2=new String(s);”例化一个新的 String对象,并使用String类的拷贝构造函 数,将它赋给引用s2。s被当作参数传送给 构造函数,新的String对象包含了String对 象s中的字符的拷贝。 在大多数情况下,没有必要拷贝已有的 String对象。String对象是不变的,一旦创 建后就不能改变它们的内容(字符串)。 而且,如果有一个或多个引用指向某个 String对象,垃圾收集器就不能回收该对象 。也就是说,String引用既不能用于修改 String对象,也不能删除String对象。这一 点与C语言或C语言是不同的。 “s3=new String(charArray);”实例 化一个新的String对象,并使用以字符数组 为参数的String类构造函数,将它赋给引用 s3。新的String对象包含了数组中字符的拷 贝。 “s4=new String(charArray,6,3) ;”实例化一个String对象,使用以一个字 符数组和两个整数为参数的String类构造函 数,将它赋给引用s4。第2个参数指定了在 数组中拷贝字符的起始位置(offset)。第 3个参数指定了数组中拷贝字符的数目( count),新的String对象包含了数组中指 定字符的拷贝。如果offset或count参数指 定的所取元素超过了字符数组的界限,就 会产生 StringIndexOutOfBoundsException 的例外处理。 “s5=new String(byteArray,4,4) ;”实例化一个新的String对象,使用以一 个byte数组和两个整数为参数的String类构 造函数,将它赋给引用s5。第2和第3个参 数分别指定了offset和count。新的String对 象包含了数组中指定 byte 的拷贝。如果 offset或count参数指定的所取元素超过了 byte数组的界限,就会产生一个 StringIndexOutOfBoundsException的例外 处理。 “s6=new String(byteArray);”实例 化一个新的String对象,使用以一个byte数 组为参数的 String类构造函数,将它赋给 引用s6。新的String对象包含了数组中byte 的拷贝。 “s7=new String(buffer);”实例化一 个新的String对象,使用以StringBuffer为 参数的String类构造函数,将它赋给引用s7 。StringBuffer是一个可动态改变大小和内 容的字符串。新的String对象包含了 StringBuffer中字符的拷贝。 2String类的length、charAt和 getChars方法 下面的例子演示了String 类的length 、charAt和getChars方法,它们分别用于 确定String 类的长度、取String某一指定位 置的字符以及取String某一子串。 3String类的字符串比较 例4-7: import javax.swing.JOptionPane; public class StringCompare public static void main( String args ) String s1, s2, s3, s4, output; s1 = new String( “hello“ ); s2 = new String( “good bye“ ); s3 = new String( “Happy Birthday“ ); s4 = new String( “happy birthday“ ); output = “s1 = “ + s1 + “ns2 = “ + s2 + “ns3 = “ + s3 + “ns4 = “ + s4 + “nn“; if ( s1.equals( “hello“ ) ) output += “s1 equals “hello“n“; else output += “s1 does not equal “hello“n“; if ( s1 = “hello“ ) output += “s1 equals “hello“n“; else output += “s1 does not equal “hello“n“; if ( s3.equalsIgnoreCase( s4 ) ) output += “s3 equals s4n“; else output += “s3 does not equal s4n“; output += “pareTo( s2 ) is “ + pareTo( s2 ) + “pareTo( s1 ) is “ + pareTo( s1 ) + “pareTo( s1 ) is “ + pareTo( s1 ) + “pareTo( s4 ) is “ + pareTo( s4 ) + “pareTo( s3 ) is “ + pareTo( s3 ) + “nn“; if ( s3.regionMatches( 0, s4, 0, 5 ) ) output += “First 5 characters of s3 and s4 matchn“; else output +=“First 5 characters of s3 and s4 do not matchn“; if ( s3.regionMatches( true, 0, s4, 0, 5 ) ) output += “First 5 characters of s3 and s4 match“; else output +=“First 5 characters of s3 and s4 do not match“; JOptionPane.showMessageDialog( null, output, “Demonstrating String Class Constructors“, JOptionPane.INFORMATION_MESS AGE ); System.exit( 0 ); 4在字符串中定位字符和子串 5从字符串中抽取子串 6字符串连接 public String concat(String st)可返 回一个字符串,它将把参数str添加在原字 符串的后面形成一个新的字符串。但在 Java中,更多的是使用“”来连接字符串 。 这里读者可能会产生一个小小的迷惑, 因为前面我们讲过String对象是不能改变的 。实际上,字符串的连接是由编译器利用 StringBuffer的方法append来实现的。这在 下面的章节中讲解。 例4-10: import javax.swing.*; public class StringConcat public static void main( String args ) String s1 = new String( “Happy “ ), s2 = new String( “Birthday“ ), output; output = “s1 = “ + s1 +“ns2 = “ + s2; output += “nnResult of s1.concat( s2 ) = “ +s1.concat( s2 ); output += “ns1 after concatenation = “ + s1; JOptionPane.showMessageDialog( null, output, “Demonstrating String Method concat“, JOptionPane.INFORMATION_ MESSAGE ); System.exit( 0 ); 运行结果见图4-10。 7转化为字符串 图4-10 4.2.2 StringBuffer类 String 类提供了很多处理字符串的功 能。但是,一旦创建了字符串对象,它的 内容就永远不会变。下面将讨论 StringBuffer类的特点。这个类可以创建和 操纵动态字符串,即可修改的字符串。每 个StringBuffer都能够存储由它的容量所指 定的一些字符。如果超过了StringBuffer的 容量,容量就会自动地扩大以容纳多出来 的字符。我们将看到,StringBuffer类还可 用来实现用于字符串连接的运算符“。 String 对象是常量字符串, StringBuffer 对象是可修改的字符串。 Java 区分字符串和可修改的字符串是为了 优化的目的。特别地,Java可以实现有关 String 对象的某些优化,例如多个引用共 享一个String 对象,因为它知道这些对象 不会改变。 注意:在选择是用String对象还是用 StringBuffer对象来表示一个字符串时,如 果该对象确实不会改变,则总是使用String 对象,这样做可以改善性能。对String对象 调用非 String 类的StringBuffer方法是一种 语法错误。StringBuffer 提供的方法有一 些与 String 相同,有一些不同。最主要的 方法有两组,一组是append,另一组是 insert。 4.3 AWT 4.3.1 AWT概述 4.3.2 AWT的特 点 4.3.3 AWT应用 4.4 Java applet 4.4.1 Java applet的特 点 Java applet与Java应用程序不同。它 们的不同之处有以下几个方面。 (1)Java应用程序中,必须有一个 main()方法。Main()方法是程序的入口, 当程序开始运行时,解释器首先查找 main()方法并执行。而Java applet中则不 需要main()方法,它必须嵌入HTML文件 中,由支持Java applet的浏览器运行。 (2)Java应用程序可以独立运行。而 Java applet不能独立运行,需要依赖于网 络浏览器。 (3)Java应用程序所实现的功能是完 全的,不需依赖于其他程序。而Java applet实现的功能是不完全的,它必须借助 于浏览器中预先设计好的功能和已有的图 形界面。Java applet只需接收浏览器发送 给它的消息,并及时做出响应。 (4)Java应用程序中的所有方法的 使用是通过调用实现的。可以人为控制。 而Java applet中有一部分方法是固定的, 只能由浏览器在特定时刻和场合调用,不 能人为控制,但可以重载。 4.4.2 Java applet的程 序结构 Java applet的一般程序结构如下: import java.applet.*; import java.awt.*; public class 子类名 extends Applet /定义Applet类的子类 public void init() 方法体 /初始化方法 public void start() 方法体 /开始执行方法 public void stop() 方法体 /停止执行方法 public void destroy() 方法体 /退出方法 public void paint(Graphics g) 方法体 /绘画方法 从Java applet程序结构看出,Java applet由若干类组成,无需main()方法,但 必须有且仅有一个主类,该类是Applet类 的子类,且被声明为public。程序被保存时 ,程序名必须命名为主类名,即程序名与 主类名完全相同,后缀为.java。主类中定 义了init()、start()、stop()、destroy()和 paint()方法,这些方法是从Applet中继承 的,有固定的含义,由浏览器在时机成熟 时自动执行。 4.4.3 Applet的主要方 法 在浏览器中运行Applet程序,从运行 开始到运行结束,Applet程序需经历4个状 态,分别是初始状态、运行状态、停止态 和消亡状态。这4种状态分别对应Applet的 4个主要方法:init()、start()、stop()和 destroy()。 对于支持Java的浏览器,如果在运行 一个HTML文件时发现该文件包含Applet 程序,浏览器就会生成该Applet的一个实 例,并调用init()方法,进入初始化状态, 在该状态下完成Applet的一些初始化操作 。初始化完成后,浏览器接着调用start()方 法,进入运行状态,真正开始执行Applet ,在该状态下Applet通常会启动一些线程 执行各种任务。 当退出当前主页时,浏览器调用 stop()方法终止在运行状态下启动的线程, 进入停止状态。当用户退出浏览器时,浏 览器首先调用Applet的stop()方法,停止 Applet的执行,然后调用destroy()方法释 放Applet占用的系统资源,进入消亡状态 。 下面具体介绍init()、start()、stop()和 destroy()4种方法。 1Init()方法 在Applet执行过程中,init()方法只执行 一次。当浏览器第一次浏览含有Applet的 Web页载入Applet时,就会执行init()方法 。 由于在Applet执行过程中,该方法只被 执行一次,所以可以在init()方法中进行一 些只需执行一次的初始化操作,如变量的 初始化、设置Applet初始状态、载入图形 或字体、获取HTML中Applet标记单元中 设定的参数等。 2start()方法 调用完init()方法,浏览器将调用start() 方法启动Applet。和init()方法不同,在 Applet的执行过程中,start()方法可被浏览 器调用多次。在下列情况下,浏览器会调 用start()方法。 (1)浏览器从图标状态恢复为窗口状 态或缩放浏览器窗口时。 (2)Applet第一次载入时。 (3)离开该Web页后又再返回时。 (4)reload该页面时。 在start()方法中可启动相关线程来控制 Applet,给引入类对象发送消息,或以某 种方式通知Applet开始运行。该方法是 Applet的主体。 3stop()方法 该方法与start()方法是相对应的,在 Applet执行过程中,也会被浏览器调用多 次。在下列情况下,浏览器会调用stop()方 法。 (1)浏览器从图标状态恢复为窗口状 态或缩放浏览器窗口时。 (2)离开Applet所在Web页时。 (3)reload该页面时。 (4)关闭该Web页时。 (5)从该Web页退出浏览器运行时。 stop()方法可在适当时机挂起 Applet, 停止一些占用系统资源的工作,释放系统 处理资源,以提高系统的运行速度。 4destroy()方法 在彻底结束对该Web页的访问或退出浏 览器时调用destroy()方法,卸载Applet, 释放载入Applet时分配的系统资源。在 Applet的执行过程中,destroy()方法只执 行一次。 destroy()方法是Applet类的类方法,只 能用于Applet。可在该方法中执行释放系 统资源的代码。但一般不需重写destroy() 方法,因为Java运行系统本身会自动进行“ 垃圾”处理和内存管理,除非用了特殊的资 源如创建的线程。 注意:destroy()方法与stop()方法不同 。 除了上述4个方法外,Applet还提供一 个非常重要的方法:paint(Graphics g) 方法。该方法用于进行绘图的具体操作, 但没有实现任何操作,用户可重写该方法 ,实现个性化的绘图操作。 在Applet执行过程中,paint()方法可以 被浏览器自动调用执行绘图操作,可调用 多次。当调整浏览窗口大小、缩放浏览窗 口、移动窗口或reload等需要重绘窗口时 都会调用paint()方法。 与其他4个方法不同

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论