实验7成员访问控制与异常.docx
- 文档编号:28224234
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:53
- 大小:345.53KB
实验7成员访问控制与异常.docx
《实验7成员访问控制与异常.docx》由会员分享,可在线阅读,更多相关《实验7成员访问控制与异常.docx(53页珍藏版)》请在冰豆网上搜索。
实验7成员访问控制与异常
山西大学计算机与信息技术学院
实
验
报告
姓名颜凯丽
学号
2021242100
专业班级
软件工程一班
课程名称
Java
实验
实验日期
2021-12-20
成绩实验名称一、实验目的
指导教师
实验
批改日期7成员访问控制与异常
理解Java包的组织结构;
(2)学会编写带有包结构的程序;
掌握包结构下的成员访问控制。
掌握根本异常的处理机制;
熟悉try语句与catch语句的搭配使用;
了解有异常处理与没有异常处理的差异;
多重catch语句的使用;
使用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,
然后在该文件夹下创
建一个名叫的程序,翻开文本编辑器按程序清单输入该程序。
程序清单
package
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=k;
}publicintreturn
getHour(){hour;
}
public
int
getMinute(){
returnminute;}publicintgetSecond(){returnsecond;}}
(2)接着在packone文件夹下创立第二个程序命名为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,然后在该文件夹下创立一个名为的程序,翻开文本编辑器按如下程序清单输入该程序。
程序清单
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文件夹中生成
和
文件。
接着分别运行这两个程序
观察程序输出结果并分析之。
运行结果和分析写在下面。
答:
运行结果:
Exceptioninthread"main"java.lang.Error:
Unresolvedcompilationproblem:
Thefieldisnotvisible
atpackone.A.main(A.java:
6)
运行结果:
从类B中访问从类B中访问从类B中访问
Clockhour=8Clockminute=30Clocksecond=5
思考
Minute
的类型为
private
型,private
修饰符可以完全隐藏类的成员,不能从类外直接访问
(1)现在请将
Clock
类的构造函数
publicClock(inti,intj,intk)
改成
Clock(inti,int
j,intk)
然后分别运行
和
B.class,
观察所得结果。
答:
运行结果:
Exceptioninthread"main"java.lang.Error:
Unresolvedcompilationproblem:
Thefieldisnotvisible
atpackone.A.main(
A.java:
6
)
B.java
运行结果
:
Exceptioninthread"main"java.lang.Error:
Unresolvedcompilationproblem:
TheconstructorClock(int,int,int)isnotvisibleatpacktwo.B.main(B.java:
8)思考不使用修饰符表示允许同一个包里的任何类直接访问类的成员,其他包中的类不可以访问
(2)由于在
程序中使用了
importpackone.*
语句从而导入了
packone
包中的
Clock
类
但是
importpackone.*
这种写法仅仅导入指定包中的
public
类
如果现在将
Clock
类的声明
publicclassClock
改成
classClock,
测试一下程序运行会报错吗
?
答:
会报错,运行结果如下:
Exceptioninthread"main"java.lang.Error:
Unresolvedcompilationproblems:
ThetypeClockisnotvisibleThetypeClockisnotvisibleThetypeClockisnotvisible
ThetypeClockisnotvisibleThetypeClockisnotvisible
atpacktwo.B.main(B.java:
9)
(3)用import语句可以导入所需的类,如果不想使用import语句,那么在使用包中的类时就必须带上完整的包路径。
现在请把程序做如下的修改:
packagepacktwo;
classB{
publicstaticvoidmain(String[]args){
c=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());
}
}
然后编译运行,观察结果是否正确。
答:
正确,运行结果如下:
从类B中访问Clockhour=8从类B中访问Clockminute=30从类B中访问Clocksecond=5(4)在和程序中分别通过getHour()、getMinute()和getSecond()访问了Clock类的数据成员,请问能否不通过这几个方法而直接访问Clock类的数据成员呢?
现在请把程序的相关局部作如下修改来进行测试,编译运行观察结果。
System.out.println("从类A中访问Clockhour="+c.hour);System.out.println("从类A中访问Clockminute="+c.minute);System.out.println("从类A中访问Clocksecond="+c.second);答:
Exceptioninthread"main"java.lang.Error:
Unresolvedcompilationproblem:
Thefieldisnotvisible
atpackone.A.main(A.java:
6)
接着请把程序的相关局部也作类似的修改并进行测试,
编译运行观察结果。
System.out.println("
从类B
中访问Clockhour="c.hour);
System.out.println("
从类B
中访问Clockminute="+c.minute),
System.out.println("
从类B
中访问Clocksecond="+c.second);
答:
Exceptioninthread"main"java.lang.Error:
Unresolvedcompilationproblems:
Syntaxerrorontoken"c",deletethistokenhourcannotberesolvedorisnotafieldThefieldisnotvisibleThefieldisnotvisible
atpacktwo.B.main(
B.java:
9
)
分析上述程序的运行结果
然后填写下表
(
可访问写
1,
不可访问写
0)
。
A类B类
hour〔public11
〕
minute(private)00
second(protected)10
四、java异常实验〔1〕除数为零异常实验目的:
(1)
掌握根本异常的处理机制
;
(2)
熟悉try
语句与catch
语句的搭配使用
;
(3)
了解有异常处理与没有异常处理的差异
;
多重catch语句的使用;
(5)使用Throws
声明异常和Throw
抛出异常。
实验任务:
在这个实验里会通过
3
个练习来开发一组相应的异常处理程序
以稳固对异常处理的理解。
这几个程序
都是围绕着一个典型的除数为
0
和数值格式异常问题而展开的
用户将从一个最简单的控制台输出的
除数为0
异常程序开始
然后建立一个
GUI环境下的除数为
0
异常的多catch
块处理,直到最后
建立一个
GUI环境下自己
Throw
抛出异常的处理程序。
所有这些程序都将建立在同一个
Project
工程中,
依次开发,
各自独立运行。
实验步骤
:
1.练习1普通控制台下的除数为O异常程序这个练习可以让用户比拟有无异常处理时的情况。
(1)如
首先建立一个空工程命名为:
C:
\Programming\
Exception,JavaProject,
然后为该工程选择适宜的路径Directory用户将在这个工程中开发本实验的所有程序。
存放它
比
(2)现在在该工程中创立第
1个程序命名为
DivideByZero.java,
这个程序中包含了一个
Public
类
DivideByZero.java,
不使用
Package,
请按照程序清单
6-1
输入该程序。
程序清单6-1//
publicclassDivideByZero{privateintdenominator,numerator,quotient;publicDivideByZero(){denominator=3;numerator=12;quotient=quotient(numerator,denominator);System.out.print("Quotientis"+quotient);}publicintquotient(intnumerator,intdenominator){returnnumerator/denominator;}publicstaticvoidmain(Stringargs[]){DivideByZeroapplication=newDivideByZero();}}编辑好源程序并保存,编译并运行,看到的结果是多少?
接下来修改源程序中的denominator值,以评估12/7,12/0时的情况。
当12/0时,观察到了什么?
是否有异常发生,输出结果是什么?
运行结果贴图:
当12/0时,发生ArithmeticException异常
(4)现在请在工程中创立第中参加以下的一组try/catch
2个程序命名为DivideByZeroTryCatch.java,
语句块,以处理除数为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-2
//
importjava.awt.*;
//Container,GridLayout
importjava.awt.event.*;
//ActionListener
importjavax.swing.*;
//JFrame
publicclassDivideByZeroGUIextendsJFrameimplementsActionListener{privateJTextFieldnumeratorField,denominatorField,outputField;privateintdenominator,numerator,quotient;publicDivideByZeroGUI()
(
{super("除数为0异常");Containercontainer=getContentPane();container.setLayout(newGridLayout(3,2));container.add(newJLabel("输入被除数",));numeratorField=newJTextField(10);container.add(numeratorField);container.add(newJLabel("输入除数并回车",));denominatorField=newJTextField(10);container.add(denominatorField);denominatorField.addActionListener(this);container.add(newJLabel("结果",));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
的结果,
看到了什么
?
是异常吗
?
假设是异常请解释原因
并分别指
出导致异常发生的语句。
答:
(1)12/3
的结果为
4,12/7
的结果为
1,没有异常
(2)12/0,12/2.2,12/a
有异常,出现
NumberFormatException
异常,导致异常发生的语句
quotient=quotient(numerator,denominator)
。
|点评|这个程序会因为除数为管产生了异常,这个基于GUI除法运算。
0和数值格式而导致异常,不过与前面的练习l程序不同的是,的程序仍然可以继续运行而不会退出,这使用户可以继续进行其他的
尽
接下来创立程序
以处理上面程序中所产生的异常
该程序应包含两个catch语句块,一个用于处理除数为0的异常,另一个用于处理数值格式输入的异常。
由于在程序中使用了Integer.parseInt()方法以获得用户输入的数值,因此当用户输入非整数时就会产生NumberFormatException异常,这个异常同样应该处理。
catch(NumberFormatExceptionex){System.out.print("Idetectedexception"+ex.toString);}
编译并运行这个异常。
评估12/0,12/1.5,12/e,并写下所观察到的程序运行结果。
运行结果:
程序
确保已经处理了上述的两个
3.在这个练习中我们要自己使用
Throws
和Throw
来声明和抛出除数为
0异常
而不是让系统去
探测并抛出异常。
首先在工程中创立一个程序文件命名为
DivideByZeroThrow.java,
这个程序与前面
numerator,intdenominator)
程序根本一致的返回类型改为double,
不过要把方法quotient(int并修改返回语句
return(double)numerator/denominator
;
修改后
编译运行程序
评估12/6,12/7,12/0,
看到的结果是什么
?
有异常发生吗
?
假设没有
请解释原因。
当评估想方法只输出
12/74
时,位小数
因为己转化为double型运算,,为此需要在适宜的位置参加以下语句
其输出结果的小数位数可能很多,其中DecimalFormat
因此可以是一个控制
小数输出格式的类。
importjava.text.DecimalFormat;
DecimalFormatprecision=newDecimalFormat(
“
〞);
〔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
时
看到异常了吗
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 成员 访问 控制 异常