ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:409.32KB ,
资源ID:7581448      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7581448.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验7 成员访问控制与异常.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验7 成员访问控制与异常.docx

1、实验7 成员访问控制与异常xxxxx大学计算机与信息技术学院实验报告姓 名学 号专业班级课程名称 Java实验实验日期成 绩指导教师批改日期实验名称实验 7 成员访问控制与异常一、实验目的(l) 理解 Java 包的组织结构 ;(2) 学会编写带有包结构的程序 ;(3) 掌握包结构下的成员访问控制。(4) 掌握基本异常的处理机制 ;(5) 熟悉 try 语句与 catch 语句的搭配使用 ; (6) 了解有异常处理与没有异常处理的差别 ; (7) 多重 catch 语句的使用 ;(8) 使用 Throws 声明异常和 Throw 抛出异常。二、实验要求编写 3 个类 , 类名分别为 Clock

2、、A、B, 其中类 Clock 和类 A 放在同一个包 packone 中 , 而类 B 则放在另一个包 packtwo 中 , 包 packone 和包 packtwo 放在同一个目录下。类 Clock 中有 3 个整型数据 hour、minute、second, 它们分别是 public、private、protected, 类 Clock 还包含一些方法使用这些数据。类 A 和类 B 的功能相似 , 都是使用类 Clock 并调用类 C1ock 中的方法。请按照下面的实验步骤 , 循序渐进的完成实验 , 并回答后面的问题。三、包的使用以及访问控制(1) 首先在 c:programming

3、 目录下创建一个文件夹 , 命名为 packone, 然后在该文件夹下创建一个名叫 Clock.java 的程序 , 打开文本编辑器按程序清单输入该程序。程序清单Clock.javapackage packone;public class Clock public int hour; private int minute; protected int second; public Clock(int i, int j, int k) setAll(i, j, k); void setAll(int i, int j, int k) hour = i; minute = j; second =

4、k; public int getHour() return hour; public int getMinute() return minute; public int getSecond() return second; (2) 接着在 packone 文件夹下创建第二个程序命名为 A.java, 打开文本编辑器按程序清单输入该程序。程序清单A.javapackage packone;class A public static void main(String args) Clock c = new Clock(5,20,10); System.out.println(从类A中访问Cloc

5、k hour=+c.hour); System.out.println(从类A中访问Clock minute=+c.minute); System.out.println(从类A中访问Clock second=+c.second); (3) 现在在 c:programming 目录下创建第二个文件夹 , 命名为 packtwo, 然后在该文件夹下创建一个名为 B.java 的程序 , 打开文本编辑器按如下程序清单输入该程序。 程序清单B.javapackage packtwo;import packone.*;class B public static void main(String arg

6、s) Clock c = new Clock(8,30,5); System.out.println(从类B中访问Clock hour=+c.getHour(); System.out.println(从类B中访问Clock minute=+c.getMinute(); System.out.println(从类B中访问Clock second=+c.getSecond(); 至此已经编辑好了 3 个源程序 , 然后在Eclipse 环境中分别编译运行packone 文件夹和 packtwo 文件夹中的程序,编译的结果将分别在 packone 文件夹和 packtwo 文件夹中生成 Clock

7、.class,A.class 和 B.class 文件。接着分别运行这两个程序 , 观察程序输出结果并分析之。运行结果和分析写在下面。答:A中存在一个错误,因为A调用了私有数据minute,而私有数据无法在不同类中读取。B通过get()函数正常读取,Eclipse中结果如下。 A的运行截图B的运行截图思考(1) 现在请将 Clock 类的构造函数 public Clock(int i,int j,int k) 改成 Clock(int i,int j,int k) 然后分别运行 A.class 和 B.class, 观察所得结果。答:A,B都无法运行,因为java中默认的前缀为protecte

8、d,不同包类也无法访问。 B运行截图(2) 由于在 B.Java 程序中使用了 import packone.* 语句从而导入了 packone 包中的Clock 类 , 但是 import packone.* 这种写法仅仅导入指定包中的 public 类 , 如果现在将 Clock 类的声明 public class Clock 改成 class Clock, 测试一下程序运行会报错吗 ?答:显示clock不可显示,因为类为protected成员。 B运行截图, (3) 用 import 语句可以导入所需的类 , 如果不想使用 import语句, 那么在使用包中的类时就必须带上完整的包路径。

9、现在请把 B.java 程序做如下的修改 :package packtwo;class B public static void main(String args) packone.Clock c = new packone.Clock(8,30,5); System.out.println(从类B中访问Clock hour=+c.getHour(); System.out.println(从类B中访问Clock minute=+c.getMinute(); System.out.println(从类B中访问Clock second=+c.getSecond(); 然后编译运行 , 观察结果是

10、否正确。答:结果正确。 (4) 在 A.java 和 B.java 程序中分别通过 getHour()、 getMinute() 和 getSecond() 访问了 Clock 类的数据成员 , 请问能否不通过这几个方法而直接访问 Clock 类的数据成员呢 ? 现在请把 A.Java 程序的相关部分作如下修改来进行测试 , 编译运行观察结果。System.out.println( 从类 A 中访问 Clock hour=+c.hour);System.out.println( 从类 A 中访问 Clock minute=+c.minute); System.out.println( 从类 A

11、 中访问 Clock second= + c.second);答:出现错误。接着请把 B.java 程序的相关部分也作类似的修改并进行测试 , 编译运行观察结果。System.out.println( 从类 B 中访问 Clock hour=c.hour);System.out.println( 从类 B 中访问 Clock minute=+c.minute), System.out.println( 从类 B 中访问 Clock second=+c.second);答:出现错误。分析上述程序的运行结果 , 然后填写下表 ( 可访问写 1, 不可访问写 0) 。hour(public)minu

12、te(private)second(protected)A类101B类100四、java异常实验(1) 除数为零异常实验目的 : (1) 掌握基本异常的处理机制 ;(2) 熟悉 try 语句与 catch 语句的搭配使用 ; (3) 了解有异常处理与没有异常处理的差别 ; (4) 多重 catch 语句的使用 ;(5) 使用 Throws 声明异常和 Throw 抛出异常。实验任务 :在这个实验里会通过 3 个练习来开发一组相应的异常处理程序 , 以巩固对异常处理的理解。这几个程序都是围绕着一个典型的除数为 0 和数值格式异常问题而展开的 , 用户将从一个最简单的控制台输出的除数为 0 异常程

13、序开始 , 然后建立一个 GUI 环境下的除数为 0 异常的多 catch 块处理 ,直到最后建立一个 GUI 环境下自己 Throw 抛出 异常的处理程序。所有这些程序都将建立在同一个 Project 项目中 , 依次开发 , 各自独立运行。实验步骤 :1. 练习 1 普通控制台下的除数为 O 异常程序 这个练习可以让用户比较有无异常处理时的情况。(1) 首先建立一个空项目命名为 Exception, 然后为该项目选择合适的路径 Directory存放它 ,比如 :C: Programming JavaProject, 用户将在这个项目中开发本实验的所有程序。 (2) 现在在该项目中创建第

14、1 个程序命名为 DivideByZero.java, 这个程序中包含了一个Public 类 DivideByZero.java, 不使用 Package, 请按照程序清单6-1 输入该程序。 程序清单 6-1 DivideByZero.java/ DivideByZero.javapublic class DivideByZero private int denominator, numerator, quotient; public void DivideByZero() denominator = 3; numerator = 12; quotient = quotient( numer

15、ator, denominator ); System.out.print(Quotient is + quotient); public int quotient ( int numerator, int denominator ) return numerator / denominator; public static void main( String args ) DivideByZero application = new DivideByZero(); (3) 编辑好源程序并保存 , 编译并运行 , 看到的结果是多少 ? 接下来修改源程序中的 denominator 值 , 以评

16、估 12/7,12/0 时的情况。当 12/0 时 , 观察到了什么 ? 是否有异常发生 , 输出结果是什么 ?答:第一次运行结果为4,12/7时为12,12/0时出现异常。运行结果贴图:(4) 现在请在工程中创建第 2 个程序命名为 DivideByZeroTryCatch.java, 该程序在上面的程序中加入以下的一组 try/catch 语句块 , 以处理除数为 0 时才发生的异常。try quotient = quotient( numerator, denominator ); System.out.print(Quotient is + quotient);catch(Arithm

17、eticException ex)System.out.print(I found exception + ex.toString();(5) 编译并运行这个程序 , 观察运行结果。运行结果贴图:|点评| 由于加入了 try/catch 语句 , 因此由函数 quotient(numerator,denominator) 所产生的异常被捕获并进行了处理 , 记住 try/catch 语句必须搭配使用 , 如仅仅有 try 语句而无 catch 语句会导致编译错误。2. 练习2 GUl 图形环境下的多 catch 块异常处理上面的程序是普通控制台环境下发生除数为 0 异常的情况 , 现在我们要看

18、看 GUI图形环境下的除数为 0 时的异常情况。(1) 现在在工程中创建第 3 个程序命名为 DivideByZeroGUI.java, 这个程序运行时会弹出图形化窗口 , 要求用户输入数值进行除法运算。请按程序清单 6-2 输入该程序。 程序清单 6-2 DivideByZeroGUI.java/ DivideByZeroGUI.javaimport java.awt.*; / Container, GridLayoutimport java.awt.event.*; / ActionListenerimport javax.swing.*; / JFramepublic class Div

19、ideByZeroGUI extends JFrame implements ActionListener private JTextField numeratorField, denominatorField, outputField; private int denominator, numerator, quotient; public DivideByZeroGUI() super( 除数为0异常 ); Container container = getContentPane(); container.setLayout( new GridLayout( 3, 2 ) ); conta

20、iner.add( new JLabel( 输入被除数 , SwingConstants.RIGHT ) ); numeratorField = new JTextField( 10 ); container.add( numeratorField ); container.add( new JLabel( 输入除数并回车 , SwingConstants.RIGHT ) ); denominatorField = new JTextField( 10 ); container.add( denominatorField ); denominatorField.addActionListene

21、r( this ); container.add( new JLabel( 结果 , SwingConstants.RIGHT ) ); outputField = new JTextField(); container.add( outputField ); setSize( 425, 100 ); setVisible( true ); public void actionPerformed( ActionEvent event ) outputField.setText( ); numerator = Integer.parseInt( numeratorField.getText()

22、); denominator= Integer.parseInt( denominatorField.getText() ); quotient = quotient( numerator, denominator ); outputField.setText( Integer.toString(quotient) ); public int quotient( int numerator, int denominator ) return numerator / denominator; public static void main( String args ) DivideByZeroG

23、UI application = new DivideByZeroGUI(); application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); (2)编译并运行这个程序,观察运行结果。运行结果贴图:思考(1) 评估 12/3,12/7 的结果 , 有异常吗 ?答:没有异常。(2) 评估 12/0,12/2.2,12/a 的结果 , 看到了什么? 是异常吗? 若是异常请解释原因 , 并分别指出导致异常发生的语句。答:无法显示结果。因为public int quotient( int numerator, int denominator )。

24、为int类型,所以会出现异常。|点评| 这个程序会因为除数为 0 和数值格式而导致异常 , 不过与前面的练习 l 程序不同的是 , 尽管产生了异常 , 这个基于 GUI 的程序仍然可以继续运行而不会退出 , 这使用户可以继续进行其他的除法运算。 接下来创建程序 DivideByZeroGUIMultiTryCatch.java 以处理上面程序中所产生的异常 , 该程序应包含两个 catch 语句块 , 一个用于处理除数为 0 的异常 , 另一个用于处理数值格式输入的异常。由于在程序中使用了 Integer.parseInt() 方法以获得用户输入的数值 , 因此当用户输入非整数时就会产生 Nu

25、mberFormatException 异常 , 这个异常同样应该处理。catch (NumberFormatException ex) System.out.print(I detected exception + ex.toString(); 编译并运行这个 DivideByZeroGUIMultiTryCatch.java 程序 , 确保已经处理了上述的两个异常。评估 12/0,12/1.5,12/e, 并写下所观察到的程序运行结果。运行结果:12/0:12/1.5:12/e:3. 练习 3 Throws 声明异常与 Throw 抛出异常在这个练习中我们要自己使用 Throws 和 Th

26、row 来声明和抛出除数为 0 异常 , 而不是让系统去探测并抛出异常。 首先在工程中创建一个程序文件命名为 DivideByZeroThrow.java, 这个程序与前面DivideByZeroGUIMultiTryCatch.java 程序基本一致 , 不过要把方法 quotient (int numerator,int denominator) 的返回类型改为 double, 并修改返回语句return(double)numerator/denominator;修改后 , 编译运行程序 , 评估12/6,12/7,12/0, 看到的结果是什么 ? 有异常发生吗 ? 若没有 , 请解释原因

27、。答:因为参数quotient为int类型,而函数返回值为double类型所以又异常。 当评估 12/7 时 , 因为己转化为 double 型运算 , 其输出结果的小数位数可能很多 ,因此可以想办法只输出 4 位小数 , 为此需要在合适的位置加入以下语句 , 其中 DecimalFormat 是一个控制小数输出格式的类。import java.text.DecimalFormat;DecimalFormat precision = new DecimalFormat(“0.0000”);outputField.setText(precision.format(quotient));修改之后当

28、运行 l2/7 和 12/0 时 , 观察结果 , 其中代表 Infinity。由于当前的程序除 0 时不会产生异常 , 因此现在用户必须自己设法 Throw 抛出一个异常 , 为此要试着修改 quotient() 方法如下 :public double quotient( int numerator, int denominator ) throws ArithmeticException if (denominator = 0) throw new ArithmeticException(); return (double)numerator / denominator; 编译运行修改好的

29、程序 , 当再次运行 12/0 时 , 看到异常了吗 ? 屏幕的输出是否准确地告诉用户这是一个什么异常 , 如果不能 , 请再稍微修改程序 , 以明确显示出这是一个除数为 0 异常。 运行截图实验 (2) 创建自己的日期错误异常类实验目的 :(1) 学会创建自己的异常类;(2) 掌握如何使用自己的异常类;(3) 了解简单的对话框 JOptionpane 类的用法。实验任务 :要求设计一个 GUI 图形窗口程序 , 该程序让用户输入一个星期中的任意一天的数字1 到 7, 然后输出该数字所对应的是星期几。 但是当用户输入的数字不在 l 到 7 范围内时 , 程序应该弹出一个对话框以显示发生了异常。

30、实验步骤:(1) 分析实验任务 , 尽管 Java 中有 ArithmeticException,NumberFormatException等异常类 , 但并没有这里想要的异常类 , 因此用户必须设计自己的异常类 BadDataException 以处理上述情况。同时还要设计一个主类 BadDataDays 以运行这个程序 , 该主类应包含一个 getDayName(int dayNumber) 方法以根据输入值返回星期几 , 在这个方法中应该使用一个 switch 语句来判断 , 并在 switch 块的 default 语句处 Throw 抛出用户的 BadDataException 异常。(2) 程序清单 6-3 是主类 BadDataDays 的程序模板 , 请完成|代码 1| |代码 6| 的程序部分 , 并输入这个程序以运行它。程序清单 23 BadDataDays.java/ BadDataDays.javapackage T7;import java.awt.*; / Container, GridLayoutimport java.awt.event.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1