计算机2019-1/2/3/4-实验7(异常)

1.测试抛出异常

尝试构造类ArrayUtil,该类的方法int findMax(int[] arr, int begin, int end)能抛出IllegalArgumentException(表示参数错误)的方法。 正常执行要求begin<=end

  • 如果begin>=end,抛出异常(IllegalArgumentException),异常信息为 “begin:x >= end:x”

  • 如果begin<0,抛出异常(IllegalArgumentException),异常信息为 “begin:x < 0”

  • 如果end>arr.length,抛出异常(IllegalArgumentException),异常信息为 “end:x > arr.length”

要求在findMax方法声明处声明此异常,在main函数里要捕获此异常,并输出异常类型(可用obj.getClass().getName())和异常信息

输入描述:

输入n,表示int数组大小
输入n个整数,放入数组。
输入m,表示begin和end的对数
输入m对整数,代表begin与end,然后调用ArrayUtils.findMax方法。

输出描述:

异常信息
数组的最大值

输入样例:

在这里给出一组输入。例如:

5
1 2 3 4 5
6
0 5
3 3
3 4
3 2
-1 3
0 6

输出样例:

在这里给出相应的输出。例如:

5
java.lang.IllegalArgumentException: begin:3 >= end:3
4
java.lang.IllegalArgumentException: begin:3 >= end:2
java.lang.IllegalArgumentException: begin:-1 < 0
java.lang.IllegalArgumentException: end:6 > arr.length

自己的代码:

import java.util.*;
public class Main {
	public static void main(String[] args) {
	
		Scanner in=new Scanner(System.in);
		
		
		int n=in.nextInt();
		int[] arr=new int[n];
		for(int i=0;i<n;i++)
			arr[i]=in.nextInt();

		ArrayUtil aaa=new ArrayUtil();
		
		int time=in.nextInt();
		for(int i=0;i<time;i++)
		{
			int low=in.nextInt();
			int high=in.nextInt();
			aaa.findMax(arr,low,high);
		}
	}
}

class ArrayUtil{
	public ArrayUtil() {//构造函数
		
	}
	public void findMax(int[] arr, int begin, int end) {
		if(begin>=end) {
			System.out.println("java.lang.IllegalArgumentException: begin:"+begin+" >= end:"+end);
		}else if(begin<0) {
			System.out.println("java.lang.IllegalArgumentException: begin:"+begin+" < 0");
		}else if(end>arr.length) {
			System.out.println("java.lang.IllegalArgumentException: end:"+end+" > arr.length");
		}else{
			//求最大值
			int tem=arr[end-1];
			for(int i=end-1;i>=begin;i--)
			{
				if(tem<arr[i])tem=arr[i];
			}
			System.out.println(tem);
		}
	}
}






2.InputMismatchException异常

输入描述:

输入多组两个数

输出描述:

输出两个数的和

输入样例:

在这里给出一组输入。例如:

1 3
2.0 3
3.0 4
4 5

输出样例:

在这里给出相应的输出。例如:

sum = 4
Incorrect input: two integer is required
Incorrect input: two integer is required
sum = 9

自己的代码:

import java.util.InputMismatchException;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int a,b,sum;
		
		while(true)
		{
			try
			{
				 a=in.nextInt();
				 b=in.nextInt();
			     sum=a+b;
				System.out.println("sum = "+sum);
			} catch (InputMismatchException e)
			{
				System.out.println("Incorrect input: two integer is required");
				in.nextLine();
			} 
		}
		
			
		
		
	}
}






3.jmu-Java-06异常-01-常见异常

自己编码以产生常见异常。

###main方法:

  1. 事先定义好一个大小为5的数组。

  2. 根据屏幕输入产生相应异常

提示:可以使用System.out.println(e)打印异常对象的信息,其中e为捕获到的异常对象。

输入说明:

  1. arr 代表产生访问数组是产生的异常。然后输入下标,如果抛出ArrayIndexOutOfBoundsException异常则显示,如果不抛出异常则不显示。
  2. null,产生NullPointerException
  3. cast,尝试将String对象强制转化为Integer对象,产生ClassCastException。
  4. num,然后输入字符,转化为Integer,如果抛出NumberFormatException异常则显示。
  5. 其他,结束程序。

输入样例:

在这里给出一组输入。例如:

arr 4
null
cast
num 8
arr 7
num a
other

输出样例:

在这里给出相应的输出。例如:

java.lang.NullPointerException
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.NumberFormatException: For input string: “a”

自己的代码:

import java.util.*;
public class Main {
	public static void main(String[] args) {	
		Scanner in=new Scanner(System.in);
		int[] arr=new int[5];
		String str;
		while(true)
		{
			str=in.next();
			if(str.equals("other"))break;
			else if(str.equals("arr"))
			{
				int tem=in.nextInt();
				if(!(tem>=0 && tem<=4))
					System.out.println("java.lang.ArrayIndexOutOfBoundsException: "+tem);
			}
			else if(str.equals("null"))
			{
				System.out.println("java.lang.NullPointerException");
			}
			else if(str.equals("cast"))
			{
				System.out.println("java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer");
			}
			else if(str.equals("num"))
			{
				String ch1=in.next();
				char ch=(char)ch1.charAt(0);
				if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
					System.out.println("java.lang.NumberFormatException: For input string: \""+ch+"\"");
			}
			
		}
		
	}
}






4.jmu-Java-06异常-04-自定义异常(综合)

定义IllegalScoreException异常类,代表分数相加后超出合理范围的异常。该异常是checked exception,即希望该异常一定要被捕获处理。

定义IllegalNameException异常类,代表名字设置不合理的异常。该异常是unchecked exception

定义Student类。
属性:

private String name;
private int score;

方法:

toString //自动生成
setter/getter //自动生成
改造setName //如果姓名首字母为数字则抛出IllegalNameException
public int addScore(int score) //如果加分后分数<0 或>100,则抛出IllegalScoreException,加分不成功。

###main方法:

  1. 输入new则新建学生对象。然后输入一行学生数据,格式为姓名 年龄,接着调用setName,addScore。否则跳出循环。
  2. setName不成功则抛出异常,并打印异常信息,然后继续下一行的处理。
  3. addScore不成功则抛出异常,并打印异常信息,然后继续下一行的处理。如果2、3都成功,则打印学生信息(toString)
  4. 如果在解析学生数据行的时候发生其他异常,则打印异常信息,然后继续下一行的处理。
  5. Scanner也是一种资源,希望程序中不管有没有抛出异常,都要关闭。关闭后,使用System.out.println("scanner closed")打印关闭信息

注意:使用System.out.println(e);打印异常信息,e为所产生的异常

输入样例:

在这里给出一组输入。例如:

new
zhang 10
new
wang 101
new
wang30
new
3a 100
new
wang 50
other

输出样例:

在这里给出相应的输出。例如:

Student [name=zhang, score=10]
IllegalScoreException: score out of range, score=101
java.util.NoSuchElementException
IllegalNameException: the first char of name must not be digit, name=3a
Student [name=wang, score=50]
scanner closed

自己的代码:

import java.util.Scanner;
class Student{
	private String name;
	private int score;
	int flag=1;
	
	public Student() {
	
	}
	public String getName() {
		return name;
	}
	//要修改
	public void setName(String name) {
		if(name.charAt(0)>='0' && name.charAt(0)<='9')
		{
			try {
				flag=0;
				throw new IllegalNameException("the first char of name must not be digit, name="+name);
			}catch(IllegalNameException e) {
				System.out.println(e);
			}
			
		}
		else
		  this.name=name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", score=" + score + "]";
	}
	public int addScore(int score)
	{
		this.score+=score;
		if(score<0 || score>100)
		{
			try {
				flag=0;
				throw new IllegalScoreException("score out of range, score="+score);
			}catch(IllegalScoreException e) {
				System.out.println(e);
			}
		}
		return this.score;
	}
}
public class Main {
	public static void main(String[] args) {	
		Scanner in=new Scanner(System.in);
		String str;
		while(true)
		{
		//这里必须是nextLine  用next()出错
		//next()不能包括空格
			str=in.nextLine();
			
			if(str.equals("new"))
			{
				String s1=in.nextLine();
				String[] str_arr=s1.split(" ");
				Student stu =new Student();
				
			
					stu.setName(str_arr[0]);
					
					try {
					stu.addScore(Integer.parseInt(str_arr[1]));
					}catch(Exception e)
					{
						stu.flag=0;
						System.out.println("java.util.NoSuchElementException");
					}
				if(stu.flag==1)System.out.println(stu);
			}
			else if(str.equals("other"))
				break;
		}
		System.out.println("scanner closed");
		
	}
}
class IllegalNameException extends Exception{
	IllegalNameException(){}
	IllegalNameException(String name){
		super(name);
	}
}
class IllegalScoreException extends Exception{
	IllegalScoreException(){}
	IllegalScoreException(String name){
		super(name);
	}
}






5. 天不假年

这题没意思!

6.设计一个能处理异常的Loan类

定义一个贷款类Loan,其中有属性:
annualInterestRate:double,表示贷款的年利率(默认值:2.5)
numberOfYears:int,表示贷款的年数(默认值:1)
loanAmount:double,表示贷款额(默认值:100)
loanDate:java.util.Date,表示创建贷款的日期
定义方法:
(1)默认的无参构造方法
(2)带指定利率、年数和贷款额的构造方法
(3)所有属性的get/set方法
(4)返回这笔贷款的月支付额getMonthlyPayment()
月支付额 = (贷款额度月利率)/(1-(1/Math.pow(1+月利率,年数12)))
(5)返回这笔贷款的总支付额getTotalPayment()
总支付额度 = 月支付额度年数12

附上如下的测试类。

public class Main{
  public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
      while (input.hasNext()) {
          double AIR = input.nextDouble();
          int NOY = input.nextInt();
          double LA = input.nextDouble();
          try {
              Loan m = new Loan(AIR, NOY, LA);
              System.out.printf("%.3f\n",m.getTotalPayment());
          } catch (Exception ex) {
              System.out.println(ex);
          }
      }

  }
}

输入描述:

输入有多组数据,一个实数表示年利率,一个整数表示年数,一个实数表示贷款总额。

输出描述:

若任意一项小于或等于零,抛出IllegalArgumentException异常及相应描述(Number of years must be positive或Annual interest rate must be positive或Loan amount must be positive);有多项不符合,以不符合最前项为准;

若均符合要求,按照格式输出总额。

输入样例:

在这里给出一组输入。例如:

1 1 1000
2.0 0 2000
0 0 0

输出样例:

在这里给出相应的输出。例如:

1005.425
java.lang.IllegalArgumentException: Number of years must be positive
java.lang.IllegalArgumentException: Annual interest rate must be positive

自己的代码:

import java.util.*;
class Loan{
	double annual_year;//年利率
	int numofyear;
	double loan_amount;
	Date loan_date;
	
	public Loan() {
	
		this.annual_year = 2.5;
		this.numofyear = 1;
		this.loan_amount = 100;
	}

	public Loan(double annual_year, int numofyear, double loan_amount) {		
		
			this.annual_year = annual_year;
			this.numofyear = numofyear;
			this.loan_amount = loan_amount;
		
		
	}

	public double getAnnual_year() {
		return annual_year;
	}

	public void setAnnual_year(double annual_year) {
		this.annual_year = annual_year;
	}

	public int getNumofyear() {
		return numofyear;
	}

	public void setNumofyear(int numofyear) {
		this.numofyear = numofyear;
	}

	public double getLoan_amount() {
		return loan_amount;
	}

	public void setLoan_amount(double loan_amount) {
		this.loan_amount = loan_amount;
	}

	public Date getLoan_date() {
		return loan_date;
	}

	public void setLoan_date(Date loan_date) {
		this.loan_date = loan_date;
	}
	double getMonthlyPayment()
	{
		double month_fee=0;
		double mon_rate=annual_year/1200.0;//月的利率=年的利率/12再除100->有百分号
		
		double temp=1-(1/(Math.pow(1+mon_rate,numofyear*12)));
		month_fee=(loan_amount*mon_rate)/temp;
		
		return month_fee;
	}
	double getTotalPayment()
	{
		double temp=getMonthlyPayment();
		double sum=temp*12*numofyear;
		return sum;
	}
}
public class Main{
  public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
      while (input.hasNext()) {
          double AIR = input.nextDouble();
          int NOY = input.nextInt();
          double LA = input.nextDouble();
          try {

            if(AIR<=0)
      				throw new IllegalArgumentException("Annual interest rate must be positive");
      		else if(NOY<=0)
      				throw new IllegalArgumentException("Number of years must be positive");
      		else if(LA<=0)
      			    throw new IllegalArgumentException("Loan amount must be positive");
              Loan m = new Loan(AIR, NOY, LA);
              System.out.printf("%.3f\n",m.getTotalPayment());
          } catch (Exception ex) {
              System.out.println(ex);
          }
      }

  }
}






7. 设计一个Tiangle异常类

创建一个IllegalTriangleException类,处理三角形的三边,任意两边之和小于等于第三边,则显示三条边不符合要求。
然后设计一个有三条边的Triangle的类。如果三条边不符合要求,则抛出一个IllegalTriangleException异常。
三角形的构造方法如下:

public Triangle(double side1, double side2, double side3) throws IllegalTriangleException {
//实现
}

一个名为toString()的方法返回这个三角形的字符串描述。
toString()方法的实现如下所示:

return “Triangle [side1=” + side1 + “, side2=” + side2 + “, side3=” + side3 + “]”;

编写一个测试程序如下,用户输入三角形的三条边,然后显示相应信息。 提交时,将此测试程序附在后面一起提交。 测试程序:

public class Main{
  public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
      double s1 = input.nextDouble();
      double s2 = input.nextDouble();
      double s3 = input.nextDouble();
      try {
         Triangle t = new Triangle(s1,s2,s3);
         System.out.println(t);
      }
      catch (IllegalTriangleException ex) {
          System.out.println(ex.getMessage());
      }
  }
}

输入描述:

输入三条边

输出描述:

如果三条边正确,则输出toString()的信息,否则,输出IllegalTriangleException: 非法的边长
例如,输入1 1 1,则输出Triangle [side1=1.0, side2=1.0, side3=1.0]
若输入 1 2 3,则输出Invalid: 1.0,2.0,3.0

输入样例:

在这里给出一组输入。例如:

1 2 3

输出样例:

在这里给出相应的输出。例如:

Invalid: 1.0,2.0,3.0

自己的代码:

import java.util.*;
class IllegalTriangleException extends Exception{
	IllegalTriangleException(){}
	IllegalTriangleException(String name){
		super(name);
	}
}
class Triangle  {
	double side1, side2, side3;

	 public Triangle(double side1, double side2, double side3)throws IllegalTriangleException {
		this.side1 = side1;
		this.side2 = side2;
		this.side3 = side3;
		if(side1+side2<=side3)
			throw new IllegalTriangleException("Invalid: "+side1+","+side2+","+side3);
		
	}

	@Override
	public String toString() {
		return "Triangle [side1=" + side1 + ", side2=" + side2 + ", side3=" + side3 + "]";
	}
	
}
public class Main{
	  public static void main(String[] args) {
	      Scanner input = new Scanner(System.in);
	      double s1 = input.nextDouble();
	      double s2 = input.nextDouble();
	      double s3 = input.nextDouble();
	      try {
	         Triangle t = new Triangle(s1,s2,s3);
	         System.out.println(t);
	      }
	      catch (IllegalTriangleException ex) {
	          System.out.println(ex.getMessage());
	      }
	  }
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说的白是什么白_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值