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结束”这个问题之后,整个问题解决起来都很简单了。


发布评论