实验7 成员访问控制与异常Word格式文档下载.docx
《实验7 成员访问控制与异常Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验7 成员访问控制与异常Word格式文档下载.docx(29页珍藏版)》请在冰豆网上搜索。
三、包的使用以及访问控制
(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
publicclassA{
publicstaticvoidmain(String[]args){
Clockc=newClock(5,20,10);
System.out.println("
从类A中访问Clockhour="
+c.getHour());
从类A中访问Clockminute="
+c.minute);
从类A中访问Clocksecond="
+c.second);
(3)现在在c:
\programming目录下创建第二个文件夹,命名为packtwo,然后在该文件夹下创建一个名为B.java的程序,打开文本编辑器按如下程序清单输入该程序。
程序清单B.java
packagepacktwo;
importpackone.*;
classB{
Clockc=newClock(8,30,5);
从类B中访问Clockhour="
从类B中访问Clockminute="
+c.getMinute());
从类B中访问Clocksecond="
+c.getSecond());
至此已经编辑好了3个源程序,然后在Eclipse环境中分别编译运行packone文件夹和packtwo文件夹中的程序,编译的结果将分别在packone文件夹和packtwo文件夹中生成Clock.class,A.class和B.class文件。
接着分别运行这两个程序,观察程序输出结果并分析之。
运行结果和分析写在下面。
运行结果:
图一
图二
答:
使用private修饰符可以完全隐藏类的成员,在类外不能直接访问它们;
使用protected修饰符的类成员,允许任何包中的子类或同一包中的类访问它们;
使用public修饰符的类成员,允许任意类访问它们。
思考
(1)现在请将Clock类的构造函数publicClock(inti,intj,intk)改成Clock(inti,intj,intk)然后分别运行A.class和B.class,观察所得结果。
图三
图四
使用默认修饰符的类不能被其他包中的类访问。
(2)由于在B.Java程序中使用了importpackone.*语句从而导入了packone包中的Clock类,但是importpackone.*这种写法仅仅导入指定包中的public类,如果现在将Clock类的声明publicclassClock改成classClock,测试一下程序运行会报错吗?
会报错,如图四。
(3)用import语句可以导入所需的类,如果不想使用import语句,那么在使用包中的类时就必须带上完整的包路径。
现在请把B.java程序做如下的修改:
classB{
packone.Clockc=newpackone.Clock(8,30,5);
从类B中访问Clockhour="
从类B中访问Clockminute="
从类B中访问Clocksecond="
然后编译运行,观察结果是否正确。
图五
(4)在A.java和B.java程序中分别通过getHour()、getMinute()和getSecond()访问了Clock类的数据成员,请问能否不通过这几个方法而直接访问Clock类的数据成员呢?
现在请把A.Java程序的相关部分作如下修改来进行测试,编译运行观察结果。
System.out.println("
从类A中访问Clockhour="
+c.hour);
从类A中访问Clockminute="
从类A中访问Clocksecond=+c.second);
如图六知,类Clock成员hour不可被同一包内的其他类直接访问。
图六
接着请把B.java程序的相关部分也作类似的修改并进行测试,编译运行观察结果。
从类B中访问Clockhour="
c.hour);
从类B中访问Clockminute="
+c.minute),
从类B中访问Clocksecond="
如图七知,类Clock成员hour和second不可被其它包内的类直接访问。
图七
分析上述程序的运行结果,然后填写下表(可访问写1,不可访问写0)。
hour(public)
minute(private)
second(protected)
A类
1
B类
四、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;
publicDivideByZero(){
denominator=3;
numerator=12;
quotient=quotient(numerator,denominator);
Quotientis"
+quotient);
publicintquotient(intnumerator,intdenominator){
returnnumerator/denominator;
DivideByZeroapplication=newDivideByZero();
(3)编辑好源程序并保存,编译并运行,看到的结果是多少?
接下来修改源程序中的denominator值,以评估12/7,12/0时的情况。
当12/0时,观察到了什么?
是否有异常发生,输出结果是什么?
图八图九
图十
(4)现在请在工程中创建第2个程序命名为DivideByZeroTryCatch.java,该程序在上面的程序中加入以下的一组try/catch语句块,以处理除数为0时才发生的异常。
try
{
quotient=quotient(numerator,denominator);
System.out.print("
+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);
输入除数并回车"
SwingConstants.RIGHT));
denominatorField=newJTextField(10);
container.add(denominatorField);
denominatorField.addActionListener(this);
结果"
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的结果,看到了什么?
是异常吗?
若是异常请解释原因,并分别指出导致异常发生的语句。
图十四
图十五
图十六
均有异常。
其中12/0是由语句“quotient=quotient(numerator,denominator);
”与语句“returnnumerator/denominator;
”引起,因为除数不能为零;
而12/2.2和12/a是由语句“denominator=Integer.parseInt(denominatorField.getText());
”引起,因为输入字符串应可以转换为int型数据。
|点评|这个程序会因为除数为0和数值格式而导致异常,不过与前面的练习l程序不同的是,尽管产生了异常,这个基于GUI的程序仍然可以继续运行而不会退出,这使用户可以继续进行其他的除法运算。
接下来创建程序DivideByZeroGUIMultiTryCatch.java以处理上面程序中所产生的异常,该程序应包含两个catch语句块,一个用于处理除数为0的异常,另一个用于处理数值格式输入的异常。
由于在程序中使用了Integer.parseInt()方法以获得用户输入的数值,因此当用户输入非整数时就会产生NumberFormatException异常,这个异常同样应该处理。
catch(NumberFormatExceptionex)
Idetectedexception"
+ex.toString);
编译并运行这个DivideByZeroGUIMultiTryCatch.java程序,确保已经处理了上述的两个异常。
评估12/0,12/1.5,12/e,并写下所观察到的程序运行结果。
参考代码:
publicclassDivideByZeroGUIMultiTryCatchextendsJFrameimplementsActionListener{
privateJTextFieldnumeratorField,denominatorField,outputField;
privateintnumerator,denominator,quotient;
publicDivideByZeroGUIMultiTryCatch(){
super("
);
container.setLayout(newGridLayout(3,2));
container.add(newJLabel("
输入被除数:
SwingConstants.RIGHT));
numeratorField=newJTextField(10);
container.add(numeratorField);
输入除数并回车"
denominatorField=newJTextField(10);
container.add(denominatorField);
denominatorField.addActionListener(this);
结果:
container.add(outputField);
setSize(425,100);
setVisible(true);
publicvoidactionPerformed(ActionEventevent){
outputField.setText("
try{
numerator=Integer.parseInt(numeratorField.getText());
denominator=Integer.parseInt(denominatorField.getText());
quotient=quotient(numerator,denominator);
catch(ArithmeticExceptionex){
System.out.println("
+ex.toString());
catch(NumberFormatExceptionex){
+ex);
publicstaticvoidmain(String[]args){
DivideByZeroGUIMultiTryCatchapplication=newDivideByZeroGUIMultiTryCatch();
图十七
图十八
图十九
3.练习3Throws声明异常与Throw抛出异常