2024年1月21日发(作者:)

实验四 异常类的定义及处理

编写程序实现如下功能:生成并捕获到NegativeArraySizeException和IndexOutOfBoundsException类型的异常,并显示捕获到的异常信息。然后在此基础上生成并捕获到NullPointerException类型的异常,并显示捕获到的异常信息。

实验步骤

1) 编写程序实现如下功能:生成并捕获到NegativeArraySizeException和IndexOutOfBoundsException类型的异常,并显示捕获到的异常信息。然后在此基础上生成并捕获到NullPointerException类型的异常,并显示捕获到的异常信息。

步骤(1):编写一个包含main方法的Application类TestException,然后定义一个方法 void

arraySize(){„„}生成并捕获NegativeArraySizeException异常。

步骤(2):添加一个方法 void outofBound(){„„}生成并捕获IndexOutOfBoundsException异常。

步骤(3):添加一个方法 void nullPointer(){„„}生成并捕获IndexOutOfBoundsException异常。

步骤(4):在main方法中分别调用以上三个方法。

步骤(5):将文件保存为,然后编译、调试应用程序。

步骤(6):将outofBound()方法中捕获异常的语句注释掉,重新编译程序,看看会不会有什么语法错误?如果没错误,执行程序看结果有什么不同?

步骤(7):将array方法重新定义为如下形式: void arraySize() throws

NegativeArraySizeException{„„} 然后修改arraySize方法中捕获NegativeArraySizeException异常的语句执行部分。

程序代码:

public class TestException {

public static void main(String[] args) {

outofBound();

nullPointer();

arraySize();

}

static void arraySize() throws NegativeArraySizeException

{

try{

int a[] = new int[-7];

}

catch(NegativeArraySizeException e){

n ("异常是:"+e); }

}

static void outofBound()

{

try{

int i;

int a[]=new int[10];

for(i=0;i<=10;i++)

{ a[i]=i;

}

}

catch(IndexOutOfBoundsException e)

{n ("异常是:"+e);}

}

static void nullPointer()

{

try{

String s;

int b;

s=null;

b=();

}

catch(NullPointerException e)

{n ("异常是:"+e);}

}

}

运行结果如图1所示:

2) 编写程序实现如下功能:计算两个数之和,参与求和运算的每个数的值都必须在10-20之间,当任意一个数超出范围时,抛出自己的异常。

步骤(1):基于系统异常类Exception,定义自己的异常类NumberRangeException。

步骤(2):定义包含main方法的Application类SelfException。

步骤(3):在SelfException类中添加公共方法:

Public static int selfExceptionTest(int int1,int int2) throws NumberRangeException使之能在求int1,int2两个数和之前检查两个数的数值范围,若符合条件则求和,否则抛出异常NumberRangeException。

步骤(4):在main方法中调用selfExceptionTest方法。

步骤(5):保存文件为,然后编译并调试程序。

步骤(6):修改main方法中调用selfExceptionTest方法的实参,看看程序的运行结果有什么不同。

源程序代码:

import edReader;

import ption;

import treamReader;

public class Num {

}

public class NumberRangeException extends Exception {

public NumberRangeException() {

}

// TODO Auto-generated constructor stub

super("The number must be between 10 and 20");}

public static double

num1,num2;

public class GetNum {

static void getNum1(){

try{1=getDouble();

}catch(NumberRangeException nre){

n("Number 1 erro:"+nre);}}

static void getNum2(){

try{2=getDouble();

}catch(NumberRangeException nre){

n("Number 1 erro:"+nre);}}

static String getStr(){

String s="";

}

static double getDouble() throws NumberRangeException{

double dnum=ouble(getStr());

try{BufferedReader in=new BufferedReader(new InputStreamReader());

s=ne();

}catch(IOException ioe){n(ioe);}

return s;

if(dnum<10||dnum>20){throw new NumberRangeException();

}

return dnum;

}}

public class Summation {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

try{n("Please input one of the numbera:");

1();

n("Please input anther one of the numbera:");

2();

运行结果如图2、3所示:

思考题:

1、翻译:

OutOfMemoryError错误

如果没有足够的可用内存,一个类的实例创建表达式,数组创建表达式,或字符串串联operatior表达会抛出一个OutOfMemoryError。

NegativeArraySizeException

如果一个数组创建表达式的维度小于零则抛出一个NegativeArraySizeException。

NullPointerException异常

如果对象引用表达式的值是空的,一个字段访问抛出一个NullPointerException。

如果是空的目标参考方法调用表达式调用一个实例方法抛出一个NullPointerException。

如果数组引用表达式的值是空的,数组访问抛出一个NullPointerException。

ArrayIndexOutOfBoundsException异常

如果数组索引表达式的值是负或大于等于数组的长度,数组访问抛出一个ArrayIndexOutOfBoundsException异常。

ClassCastException异常

抛出表明,如果他不是一个实例,代码试图对象转换为一个子类。例如,以下代码将生成一个ClassCastException:

Object x = new Integer(0);

n((String)x);

ArithmeticException

一个特殊的算术条件发生时抛出。例如,一个整数“除以零”抛出这个类的一个实例。

ArrayStoreException

如果要分配的值与数组的组件类型不兼容,分配一个引用类型的数组组件将抛出一个ArrayStoreException要分配的值是数组的组件类型不兼容。

NoSuchFieldException

此信号表明没有找到指定类名的文件

NoSuchMethodException

当方法无法找到的时候抛出此异常

NumberFormatException

抛出词异常则表明,应用程序试图将字符串转换为数值类型之一,但该字符串没有适当的格式。

FileNotFoundException

此异常表明通过指定的路径打开某文件失败

IOException异常

发生某种I / O异常的信号。这个类是最基础的由I / O操作失败或中断所产生的异常类

2.编写一个程序,用于根据用户输入的命令行参数数量来计算长方形、正方形、三角形的面积。如果输入的参数个数为1、2、3则它们应分别对应正方形、长方形、三角形,如果参数值为0,则异常处理方法显示错误消息。

[提示]:自己定义一个异常类,表示参数个数0这一异常。然后定义一个抽象的父类,并提供一个抽象的方法area(),再派生出三个子类,重写area方法,最后在main方法中编写测试逻辑

import r;

class MyException extends Exception{

public void MyException(int i){

if(i==0){

n("输入出错!!请重新输入:");

}

}

}

abstract class area{

abstract void area();

}

class RectangleArea extends area{

int area(int a,int b){

int area=a*b;

return area;

}

void area() {}

}

class SquareArea extends area{

int area(int a){

int area=a*a;

return area;

}

void area() {}

}

class TriangleArea extends area{

double area(int a,int b,int c){

double p=0.5*(a+b+c);

double area=( p*(p-a)*(p-b)*(p-c));

return area;

}

void area(){}

}

import r;

public class CountArea extends MyException{

static int a,b,c,i;

static int s[]={a,b,c};

static MyException me=new MyException();

public static void main(String args[]) throws MyException{

Scanner sca=new Scanner();

if((null)){

ption(0);

}

else{while(true){

n("输入若干个整数,用空格隔开,以Enter结束");

String num=ne();//输入数字 或者退出标志

num=rCase();//将输入的字符串变成小写

if(("Enter")){

break;

}

String[] strs=(" "); //将输入的字符串切割,获得空格前后的数字

i=;

if(i==1){

SquareArea sa=new SquareArea();

int area=(nt(strs[0]));

n("正方形面积为"+area);

}

if(i==2){

RectangleArea ra=new RectangleArea();

int area=(nt(strs[0]),nt(strs[1]));

n("长方形面积为"+area);

}

if(i==3){

TriangleArea ta=new TriangleArea();

double area=(nt(strs[0]),

nt(strs[1]), nt(strs[2]));

n("三角形面积为"+area);

}

}

}

}

}

运行结果如图3、4、5所示

上机小结:

通过本次上机,比较全面的了解了JAVA中的异常类,更重要的是基本掌握了自定义异常类的定义及使用方法。

本次上机的第二题就是有关自定义异常类的。在上机时,主要的问题在于如何使用自定义异常类,在上机时间内并没有完成这一内容,还是课后翻看课本,上网查资料然后尝试写代码最后进行调试才得到解决。

思考题的第二题,是和宿舍同学一起完成的,我们的主要困惑在于如何使程序实现逐个数据录入。我联想到以前C语言里的“用空格隔开,以Enter结束”这个常见的办法,在上网查询之后得到了这一办法的代码;然后我们再让程序具备识别输入了几个参数的功能,并依据参数的个数来判断这是一个什么形状,并调用对应的面积计算办法;然后计算、输出。

当我们解决了“用空格隔开,以Enter结束”这个问题之后,整个问题解决起来都很简单了。