一、实验目的

(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

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;

}

public int getHour() {

return hour;

}

public int getMinute() {

return minute;

}

public int getSecond() {

return second;

}

}

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

程序清单A.java

package packone;

class A {

public static void main(String[] args) {

Clock c = new Clock(5,20,10);

System.out.println("从类A中访问Clock 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.java

package packtwo;

import packone.*;

class B {

public static void main(String[] args) {

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.class,A.class 和 B.class 文件。接着分别运行这两个程序 , 观察程序输出结果并分析之。运行结果和分析写在下面。

答:

A.java

B.java

分析:A.java出错的原因是Clock类里的minute是私有类型,在其他类中不能用Clock的实例直接调用,要通过访问器getMinute()访问,也就是B类中的方法。

思考

  1. 现在请将 Clock 类的构造函数 public Clock(int i,int j,int k) 改成 Clock(int i,int j,int k) 然后分别运行 A.class 和 B.class, 观察所得结果。

答:

A.java

B.java

分析:A.java的运行结果还是修改前那样,B.java运行结果出错,A类与Clock类在同一个包packone里,B单独在packtwo里,但是B类引入了包packone还是出错,这说明只有在同一个包里的类,构造函数才是可访问的,即便是其它包里的类引入了这个包,也不能访问这个包里的构造函数,因为它对于其他包的类是不可视的,私有的。

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

答:还会报错,但是B.java的错误变了,A.java不变。

  1. java

  1. java

分析:B.java的报错说明一个包如packone中的类如Clock不设为public,另一个包如packtwo即使引入了前一个包packone,也不能访问类Clock,因为他不是public.

(3) 用 import 语句可以导入所需的类 , 如果不想使用import语句, 那么在使用包中的类时就必须带上完整的包路径。现在请把 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());

}

}

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

答:A.java错误同上,B.java错误又多了几条新的。

  1. java

  1. java

分析:即使通过packone.的形式也不能调用类Clock,因为它是非public,不可视。

(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 中访问 Clock second= + c.second);

答:

A.java

接着请把 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);

答:

B.java

分析上述程序的运行结果 , 然后填写下表 ( 可访问写 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-1  DivideByZero.java

// DivideByZero.java

public class DivideByZero

{

private int denominator, numerator, quotient;

public DivideByZero()

{

denominator = 3; numerator =  12;

quotient = quotient(  numerator, 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) 编辑好源程序并保存 , 编译并运行 , 看到的结果是多少 ? Quotient is 4接下来修改源程序中的 denominator 值 , 以评估 12/7,12/0 时的情况。当 12/0 时 , 观察到了什么 ? 报错 是否有异常发生 , 输出结果是什么 ?有异常发生

运行结果贴图:

12/3

12/7

12/0

(4) 现在请在工程中创建第 2 个程序命名为 DivideByZeroTryCatch.java, 该程序在上面的程序中加入以下的一组 try/catch 语句块 , 以处理除数为 0 时才发生的异常。

try

{

quotient = quotient(  numerator, denominator );

System.out.print("Quotient is " + quotient);

}

catch(ArithmeticException ex)

{

System.out.print("I found exception " + ex.toString);

}

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

运行结果贴图:

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

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

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

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

程序清单 6-2  DivideByZeroGUI.java

// DivideByZeroGUI.java

import java.awt.*;                // Container, GridLayout

import java.awt.event.*;          // ActionListener

import javax.swing.*;             // JFrame

public class DivideByZeroGUI 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 ) );

container.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.addActionListener( 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() );

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[] )

{

DivideByZeroGUI application = new DivideByZeroGUI();

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

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

运行结果贴图:

思考

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

(2) 评估 12/0,12/2.2,12/a 的结果 , 看到了什么? 是异常吗? 若是异常请解释原因 , 并分别指出导致异常发生的语句。

答:

  1. 没有异常。
  2. 报错,出现异常:

12/0

12/2.2

12/a

12/0报错原因是除数为0。

12/2.2和12/a报错原因是因为数值格式不对, 由于在程序中使用了 Integer.parseInt() 方法以获得用户输入的数值 , 因此当用户输入非整数时就会产生 NumberFormatException 异常

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

   接下来创建程序 DivideByZeroGUIMultiTryCatch.java 以处理上面程序中所产生的异常 , 该程序应包含两个 catch 语句块 , 一个用于处理除数为 0 的异常 , 另一个用于处理数值格式输入的异常。由于在程序中使用了 Integer.parseInt() 方法以获得用户输入的数值 , 因此当用户输入非整数时就会产生 NumberFormatException 异常 , 这个异常同样应该处理。

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 和 Throw 来声明和抛出除数为 0 异常 , 而不是让系统去探测并抛出异常。

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

return(double)numerator/denominator;

修改后 , 编译运行程序 , 评估12/6,12/7,12/0, 看到的结果是什么 ? 有异常发生吗 ? 若没有 , 请解释原因。

没有异常:

12/6

12/7

12/0

返回值类型为double,所以12/6和12/7结果为浮点型。

在浮点运算中,如果运算结果相对浮点型太大,则向上溢出到无穷大,任何数除以0得到无穷大

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

import java.text.DecimalFormat;

DecimalFormat precision = new DecimalFormat(“0.0000”);

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

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

12/7

12/0

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

public double quotient( int numerator, int denominator ) throws ArithmeticException

{

if (denominator = 0) throw new ArithmeticException;

return  (double)numerator / denominator;

}

编译运行修改好的程序 , 当再次运行 12/0 时 , 看到异常了吗 ? 屏幕的输出是否准确地告诉用户这是一个什么异常 , 如果不能 , 请再稍微修改程序 , 以明确显示出这是一个除数为 0 异常。

看到了异常,

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

实验目的 :

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

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

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

实验任务 :

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

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

实验步骤:

(1) 分析实验任务 , 尽管 Java 中有 ArithmeticException,NumberFormatException等异常类 , 但并没有这里想要的异常类 , 因此用户必须设计自己的异常类 BadDataException 以处理上述情况。同时还要设计一个主类 BadDataDays 以运行这个程序 , 该主类应包含一个 getDayName(int dayNumber) 方法以根据输入值返回星期几 , 在这个方法中应该使用一个 switch 语句来判断 ,  并在 switch 块的 default 语句处 Throw 抛出用户的 BadDataException 异常。

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

程序清单 2-3  BadDataDays.java

// BadDataDays.java

import java.awt.*;                // Container, GridLayout

import java.awt.event.*;          // ActionListener

import javax.swing.*;

public class BadDataDays extends JFrame

implements ActionListener

{

private JTextField dayNumberField, dayNameField;

private int dayNumber;

private String dayName;

public BadDataDays()

{

super( "数字转换星期  " ); //代码1

Container container = getContentPane();

container.setLayout( new GridLayout( 2 , 2 ) );

container.add(

new JLabel( "输入数字 ", SwingConstants.RIGHT ) );

dayNumberField=new JTextField(10);  //代码2    // 创建一个JTextField控件 dayNumberField

container.add( dayNumberField );

dayNumberField.addActionListener( this );

container.add(new JLabel( "星期几 ", SwingConstants.RIGHT ) );

dayNameField = new JTextField( 10 );

container.add(dayNameField); //代码3    // 将控件dayNameField 加入到容器中

this.setSize(425, 100); //代码4   // 设置窗口的大小为 (425,100)

setVisible( true );

}

public void actionPerformed( ActionEvent event )

{

dayNameField.setText( "" );

try

{

dayNumber = Integer.parseInt( dayNumberField.getText() );

dayName = getDayName(dayNumber);

dayNameField.setText(dayName); //代码5  // 在控件dayNameField中输出结果

}

catch (BadDataException ex)

{

JOptionPane.showMessageDialog(

BadDataDays.this, ex.toString(), "无效日期", JOptionPane.WARNING_MESSAGE );

}

catch (NumberFormatException ex)

{

System.out.println("I detected Exception " + ex.toString());

}

}

public String getDayName(int dayNumber) throws BadDataException

{

//  此处加入switch 语句块以根据输入值dayNumber 判断星期几,

//     并在default处Throw抛出BadDataException异常

switch(dayNumber) {  //代码6

case 1:return "星期一";

case 2:return "星期二";

case 3:return "星期三";

case 4:return "星期四";

case 5:return "星期五";

case 6:return "星期六";

case 7:return "星期日";

default:throw new BadDataException("输入错误!");

}

}

public static void main( String args[] )

{

BadDataDays  application = new BadDataDays();

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

点评  该程序的关键是用户设计了自己的异常类BadDataException,它继承自运行期异常类RuntimeException ,通常自定义的异常类都是继承自Exception或    RuntimeException,当异常发生时,通过Throw语句抛出这个异常的实例,然后就像捕获一般异常一样进行处理。记住,对自定义异常系统是不会自动抛出的,必须由程序员手动抛出。

五.编写一个程序,它能导致JVM抛出一个OutOfMemoryError的异常,然后捕获并处理这个异常。

package project7;public class OutOfMemory {public static void main(String[] args) throws OutOfMemoryError{try {int[] a=new int[Integer.MAX_VALUE];}catch (OutOfMemoryError e) {//System.out.println(e.getMessage());System.out.println(e.toString());}}}

实验 7——成员访问控制与异常相关推荐

  1. 轻松理解—继承成员访问控制机制

    在我们学习面向对象程序设计的时候,那么这个继承成员访问控制机制您必须对其有深入的了解,达到熟练掌握的目的:要不也许这点知识你不过关,你对这点知识还抱着半信半疑的感觉,那么你一旦碰到这个问题,你的第一个 ...

  2. HCIP-Datacom 分解实验1:访问控制列表

    路由控制实验1:访问控制列表 访问控制列表(ACL: Access Control List)是一种常用的网络技术,它的基本功能是对经过网络设备的报文进行过滤处理. ACL 是由 permit 和 d ...

  3. Java实验7 四、Java异常类(2)创建自己的日期错误异常类

    实验目的 : (1) 学会创建自己的异常类; (2) 掌握如何使用自己的异常类; (3) 了解简单的对话框 JOptionpane 类的用法. 实验任务 : 要求设计一个 GUI 图形窗口程序 , 该 ...

  4. Hadoop之——setfacl 设置访问控制列表异常

    转载请注明出处:https://blog.csdn.net/l1028386804/article/details/94992969 默认情况下,在命令行执行Hadoop的设置访问控制列表时,出现异常 ...

  5. 单处理机系统的进程调度实验_Chcore -- 上交IPADS操作系统银杏书配套Lab实验笔记 - Lab3进程与异常(一)...

    实验为IPADS<现代操作系统原理与实现>配套实验,慕课上有完整的课程教学视频,以下为个人实验过程和踩坑记录. Capability 为什么需要有capability?用户进程是不能直接访 ...

  6. 计算机网络实验报告访问控制列表,电子政务《计算机网络实验》期末报告 07-访问控制列表实验报告.doc...

    文档介绍: 计算机网络实验报告 1. 实验报告如有雷同,雷同各方当次实验成绩均以 0 分计. 2. 当次小组成员成绩只计学号.姓名登录在下表中的. 3. 在规定时间内未上交实验报告的, 不得以其他方式 ...

  7. 利用Kafka和Cassandra构建实时异常检测实验

    导言 异常检测是一种跨行业的方法,用于发现事件流中的异常事件 - 它适用于物联网传感器,财务欺诈检测,安全性,威胁检测,数字广告欺诈以及许多其他应用程序.此类系统检查流数据以检查异常或不规则,并在检测 ...

  8. 标准访问控制列表配置(51cto: 实验 34)

    1. 实验线路连接图 使用 Cisco Packet Tracer5.3 构建拓扑结构图. 先配置rip协议使主机1.主机0.http服务器能够互通 RA Router>enable Route ...

  9. 计算机网络访问控制列表,南昌大学计算机网络实验-访问控制列表ACL

    南昌大学实验报告 学生姓名: 学 号: 专业班级: 实验类型:■ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩: 实验4:访问控制列表ACL配置实验 一.实验目的 对路由器的访问控制列表A ...

最新文章

  1. Lua中的基本函数库
  2. Java常用消息队列原理介绍及性能对比
  3. Android模拟器Genymotion安装apk
  4. 代码之谜(一)- 有限与无限
  5. 蚂蚁研发流程大公开:上百个开发者也能同时在一个 App 环境内进行高效开发
  6. 文件夹修改名字 matlab,matlab用 movefile更改文件夹内文件名字
  7. leetcode 406. 根据身高重建队列(贪心算法)
  8. 要求在ASP.NET Core 2.2中确认电子邮件——第1部分
  9. Elasticsearch搜索类型(query type)详解
  10. sudo修改文件夹名字_用 Python 高效智能管理文件夹
  11. java关键字定义字符变量_Java 关键字和标识符
  12. 《数值分析》-- 复化求积公式
  13. Linux入门基础——常用命令(四)
  14. 守护进程的单实例实现_非宁静无以致远_百度空间
  15. KW代码检查规则-RLK.JNDI
  16. 增加表空间数据文件语句
  17. 音乐计算机在线应用,计算机音乐技术在传统音乐创作中的应用及影响
  18. 技术博客那些事儿-如何写好博客
  19. html bs架构调用客户端打印机用客户端及客户端局域网打印机打印,使用ScriptX.cab控件...
  20. CodeForces 13A【暴力】

热门文章

  1. 一个程序员关注的微信公众账号
  2. 街篮先锋测试显示服务器,街篮手游先锋测试玩家教你中锋搭配技巧
  3. 什么无线蓝牙耳机没有延迟?专业游戏无线蓝牙耳机推荐
  4. 0基础学习VR全景平台篇第27章:场景管理-视角功能
  5. 小米5S plus和小米5S价格相同,该咋选?
  6. js正则表达式验证IP地址
  7. 一文读懂Thread技术的起源、原理及发展
  8. 小程序实现外卖滑动菜单栏
  9. STC单片机官网链接
  10. eset许可证文件下载