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

上传人:b****6 文档编号:7581448 上传时间:2023-01-25 格式:DOCX 页数:21 大小:409.32KB
下载 相关 举报
实验7 成员访问控制与异常.docx_第1页
第1页 / 共21页
实验7 成员访问控制与异常.docx_第2页
第2页 / 共21页
实验7 成员访问控制与异常.docx_第3页
第3页 / 共21页
实验7 成员访问控制与异常.docx_第4页
第4页 / 共21页
实验7 成员访问控制与异常.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

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

《实验7 成员访问控制与异常.docx》由会员分享,可在线阅读,更多相关《实验7 成员访问控制与异常.docx(21页珍藏版)》请在冰豆网上搜索。

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

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

xxxxx大学计算机与信息技术学院

实验报告

姓名

学号

专业班级

课程名称

Java实验

实验日期

成绩

指导教师

批改日期

实验名称

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

一、实验目的

(l)理解Java包的组织结构;

(2)学会编写带有包结构的程序;

(3)掌握包结构下的成员访问控制。

(4)掌握基本异常的处理机制;

(5)熟悉try语句与catch语句的搭配使用;

(6)了解有异常处理与没有异常处理的差别;

(7)多重catch语句的使用;

(8)使用Throws声明异常和Throw抛出异常。

二、实验要求

编写3个类,类名分别为Clock、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目录下创建一个文件夹,命名为packone,然后在该文件夹下创建一个名叫Clock.java的程序,打开文本编辑器按程序清单输入该程序。

程序清单Clock.java

packagepackone;

publicclassClock{

publicinthour;

privateintminute;

protectedintsecond;

publicClock(inti,intj,intk){

setAll(i,j,k);

}

voidsetAll(inti,intj,intk){

hour=i;

minute=j;

second=k;

}

publicintgetHour(){

returnhour;

}

publicintgetMinute(){

returnminute;

}

publicintgetSecond(){

returnsecond;

}

}

(2)接着在packone文件夹下创建第二个程序命名为A.java,打开文本编辑器按程序清单输入该程序。

程序清单A.java

packagepackone;

classA{

publicstaticvoidmain(String[]args){

Clockc=newClock(5,20,10);

System.out.println("从类A中访问Clockhour="+c.hour);

System.out.println("从类A中访问Clockminute="+c.minute);

System.out.println("从类A中访问Clocksecond="+c.second);

}

}

(3)现在在c:

\programming目录下创建第二个文件夹,命名为packtwo,然后在该文件夹下创建一个名为B.java的程序,打开文本编辑器按如下程序清单输入该程序。

程序清单B.java

packagepacktwo;

importpackone.*;

classB{

publicstaticvoidmain(String[]args){

Clockc=newClock(8,30,5);

System.out.println("从类B中访问Clockhour="+c.getHour());

System.out.println("从类B中访问Clockminute="+c.getMinute());

System.out.println("从类B中访问Clocksecond="+c.getSecond());

}

}

至此已经编辑好了3个源程序,然后在Eclipse环境中分别编译运行packone文件夹和packtwo文件夹中的程序,编译的结果将分别在packone文件夹和packtwo文件夹中生成Clock.class,A.class和B.class文件。

接着分别运行这两个程序,观察程序输出结果并分析之。

运行结果和分析写在下面。

答:

A中存在一个错误,因为A调用了私有数据minute,而私有数据无法在不同类中读取。

B通过get()函数正常读取,Eclipse中结果如下。

A的运行截图

B的运行截图

 

思考

(1)现在请将Clock类的构造函数publicClock(inti,intj,intk)改成Clock(inti,intj,intk)然后分别运行A.class和B.class,观察所得结果。

答:

A,B都无法运行,因为java中默认的前缀为protected,不同包类也无法访问。

B运行截图

(2)由于在B.Java程序中使用了importpackone.*语句从而导入了packone包中的Clock类,但是importpackone.*这种写法仅仅导入指定包中的public类,如果现在将Clock类的声明publicclassClock改成classClock,测试一下程序运行会报错吗?

答:

显示clock不可显示,因为类为protected成员。

B运行截图

(3)用import语句可以导入所需的类,如果不想使用import语句,那么在使用包中的类时就必须带上完整的包路径。

现在请把B.java程序做如下的修改:

packagepacktwo;

classB{

publicstaticvoidmain(String[]args){

packone.Clockc=newpackone.Clock(8,30,5);

System.out.println("从类B中访问Clockhour="+c.getHour());

System.out.println("从类B中访问Clockminute="+c.getMinute());

System.out.println("从类B中访问Clocksecond="+c.getSecond());

}

}

然后编译运行,观察结果是否正确。

答:

结果正确。

(4)在A.java和B.java程序中分别通过getHour()、getMinute()和getSecond()访问了Clock类的数据成员,请问能否不通过这几个方法而直接访问Clock类的数据成员呢?

现在请把A.Java程序的相关部分作如下修改来进行测试,编译运行观察结果。

System.out.println("从类A中访问Clockhour="+c.hour);

System.out.println("从类A中访问Clockminute="+c.minute);

System.out.println("从类A中访问Clocksecond=+c.second);

答:

出现错误。

 

接着请把B.java程序的相关部分也作类似的修改并进行测试,编译运行观察结果。

System.out.println("从类B中访问Clockhour="c.hour);

System.out.println("从类B中访问Clockminute="+c.minute),

System.out.println("从类B中访问Clocksecond="+c.second);

答:

出现错误。

分析上述程序的运行结果,然后填写下表(可访问写1,不可访问写0)。

hour(public)

minute(private)

second(protected)

A类

1

0

1

B类

1

0

0

四、java异常

实验

(1)除数为零异常

实验目的:

(1)掌握基本异常的处理机制;

(2)熟悉try语句与catch语句的搭配使用;

(3)了解有异常处理与没有异常处理的差别;

(4)多重catch语句的使用;

(5)使用Throws声明异常和Throw抛出异常。

实验任务:

在这个实验里会通过3个练习来开发一组相应的异常处理程序,以巩固对异常处理的理解。

这几个程序都是围绕着一个典型的除数为0和数值格式异常问题而展开的,用户将从一个最简单的控制台输出的除数为0异常程序开始,然后建立一个GUI环境下的除数为0异常的多catch块处理,直到最后建立一个GUI环境下自己Throw抛出异常的处理程序。

所有这些程序都将建立在同一个Project项目中,依次开发,各自独立运行。

实验步骤:

1.练习1普通控制台下的除数为O异常程序

这个练习可以让用户比较有无异常处理时的情况。

(1)首先建立一个空项目命名为Exception,然后为该项目选择合适的路径Directory存放它,比如:

C:

\Programming\JavaProject,用户将在这个项目中开发本实验的所有程序。

(2)现在在该项目中创建第1个程序命名为DivideByZero.java,这个程序中包含了一个Public类DivideByZero.java,不使用Package,请按照程序清单6-1输入该程序。

程序清单6-1DivideByZero.java

//DivideByZero.java

publicclassDivideByZero

{

privateintdenominator,numerator,quotient;

publicvoidDivideByZero()

{

denominator=3;numerator=12;

quotient=quotient(numerator,denominator);

System.out.print("Quotientis"+quotient);

}

publicintquotient(intnumerator,intdenominator)

{

returnnumerator/denominator;

}

publicstaticvoidmain(Stringargs[])

{

DivideByZeroapplication=newDivideByZero();

}

}

(3)编辑好源程序并保存,编译并运行,看到的结果是多少?

接下来修改源程序中的denominator值,以评估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("Quotientis"+quotient);

}

catch(ArithmeticExceptionex)

{

System.out.print("Ifoundexception"+ex.toString());

}

(5)编译并运行这个程序,观察运行结果。

运行结果贴图:

|点评|由于加入了try/catch语句,因此由函数quotient(numerator,denominator)所产生的异常被捕获并进行了处理,记住try/catch语句必须搭配使用,如仅仅有try语句而无catch语句会导致编译错误。

2.练习2GUl图形环境下的多catch块异常处理

上面的程序是普通控制台环境下发生除数为0异常的情况,现在我们要看看GUI图形环境下的除数为0时的异常情况。

(1)现在在工程中创建第3个程序命名为DivideByZeroGUI.java,这个程序运行时会弹出图形化窗口,要求用户输入数值进行除法运算。

请按程序清单6-2输入该程序。

程序清单6-2DivideByZeroGUI.java

//DivideByZeroGUI.java

importjava.awt.*;//Container,GridLayout

importjava.awt.event.*;//ActionListener

importjavax.swing.*;//JFrame

publicclassDivideByZeroGUIextendsJFrame

implementsActionListener

{

privateJTextFieldnumeratorField,denominatorField,outputField;

privateintdenominator,numerator,quotient;

publicDivideByZeroGUI()

{

super("除数为0异常");

Containercontainer=getContentPane();

container.setLayout(newGridLayout(3,2));

container.add(

newJLabel("输入被除数",SwingConstants.RIGHT));

numeratorField=newJTextField(10);

container.add(numeratorField);

container.add(

newJLabel("输入除数并回车",

SwingConstants.RIGHT));

denominatorField=newJTextField(10);

container.add(denominatorField);

denominatorField.addActionListener(this);

container.add(

newJLabel("结果",SwingConstants.RIGHT));

outputField=newJTextField();

container.add(outputField);

setSize(425,100);

setVisible(true);

}

publicvoidactionPerformed(ActionEventevent)

{

outputField.setText("");

numerator=Integer.parseInt(numeratorField.getText());

denominator=Integer.parseInt(denominatorField.getText());

quotient=quotient(numerator,denominator);

outputField.setText(Integer.toString(quotient));

}

publicintquotient(intnumerator,intdenominator)

{

returnnumerator/denominator;

}

publicstaticvoidmain(Stringargs[])

{

DivideByZeroGUIapplication=newDivideByZeroGUI();

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

(2)编译并运行这个程序,观察运行结果。

运行结果贴图:

思考

(1)评估12/3,12/7的结果,有异常吗?

答:

没有异常。

(2)评估12/0,12/2.2,12/a的结果,看到了什么?

是异常吗?

若是异常请解释原因,并分别指出导致异常发生的语句。

答:

无法显示结果。

因为publicintquotient(intnumerator,intdenominator)。

为int类型,所以会出现异常。

|点评|这个程序会因为除数为0和数值格式而导致异常,不过与前面的练习l程序不同的是,尽管产生了异常,这个基于GUI的程序仍然可以继续运行而不会退出,这使用户可以继续进行其他的除法运算。

接下来创建程序DivideByZeroGUIMultiTryCatch.java以处理上面程序中所产生的异常,该程序应包含两个catch语句块,一个用于处理除数为0的异常,另一个用于处理数值格式输入的异常。

由于在程序中使用了Integer.parseInt()方法以获得用户输入的数值,因此当用户输入非整数时就会产生NumberFormatException异常,这个异常同样应该处理。

catch(NumberFormatExceptionex)

{

System.out.print("Idetectedexception"+ex.toString());

}

编译并运行这个DivideByZeroGUIMultiTryCatch.java程序,确保已经处理了上述的两个异常。

评估12/0,12/1.5,12/e,并写下所观察到的程序运行结果。

运行结果:

12/0:

12/1.5:

12/e:

3.练习3Throws声明异常与Throw抛出异常

在这个练习中我们要自己使用Throws和Throw来声明和抛出除数为0异常,而不是让系统去探测并抛出异常。

首先在工程中创建一个程序文件命名为DivideByZeroThrow.java,这个程序与前面DivideByZeroGUIMultiTryCatch.java程序基本一致,不过要把方法quotient(intnumerator,intdenominator)的返回类型改为double,并修改返回语句

return(double)numerator/denominator;

修改后,编译运行程序,评估12/6,12/7,12/0,看到的结果是什么?

有异常发生吗?

若没有,请解释原因。

答:

因为参数quotient为int类型,而函数返回值为double类型所以又异常。

当评估12/7时,因为己转化为double型运算,其输出结果的小数位数可能很多,因此可以想办法只输出4位小数,为此需要在合适的位置加入以下语句,其中DecimalFormat是一个控制小数输出格式的类。

importjava.text.DecimalFormat;

DecimalFormatprecision=newDecimalFormat(“0.0000”);

outputField.setText(precision.format(quotient));

修改之后当运行l2/7和12/0时,观察结果,其中∞代表Infinity。

由于当前的程序除0时不会产生异常,因此现在用户必须自己设法Throw抛出一个异常,为此要试着修改quotient()方法如下:

publicdoublequotient(intnumerator,intdenominator)throwsArithmeticException

{

if(denominator==0)thrownewArithmeticException();

return(double)numerator/denominator;

}

编译运行修改好的程序,当再次运行12/0时,看到异常了吗?

屏幕的输出是否准确地告诉用户这是一个什么异常,如果不能,请再稍微修改程序,以明确显示出这是一个除数为0异常。

运行截图

实验

(2)创建自己的日期错误异常类

实验目的:

(1)学会创建自己的异常类;

(2)掌握如何使用自己的异常类;

(3)了解简单的对话框JOptionpane类的用法。

实验任务:

要求设计一个GUI图形窗口程序,该程序让用户输入一个星期中的任意一天的数字1到7,然后输出该数字所对应的是星期几。

但是当用户输入的数字不在l到7范围内时,程序应该弹出一个对话框以显示发生了异常。

实验步骤:

(1)分析实验任务,尽管Java中有ArithmeticException,NumberFormatException等异常类,但并没有这里想要的异常类,因此用户必须设计自己的异常类BadDataException以处理上述情况。

同时还要设计一个主类BadDataDays以运行这个程序,该主类应包含一个getDayName(intdayNumber)方法以根据输入值返回星期几,在这个方法中应该使用一个switch语句来判断,并在switch块的default语句处Throw抛出用户的BadDataException异常。

(2)程序清单6-3是主类BadDataDays的程序模板,请完成|代码1|~|代码6|的程序部分,并输入这个程序以运行它。

程序清单2-3BadDataDays.java

//BadDataDays.java

packageT7;

importjava.awt.*;//Container,GridLayout

importjava.awt.event.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

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

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