文章目录
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方法:
-
事先定义好一个大小为5的数组。
-
根据屏幕输入产生相应异常
提示:可以使用System.out.println(e)打印异常对象的信息,其中e为捕获到的异常对象。
输入说明:
- arr 代表产生访问数组是产生的异常。然后输入下标,如果抛出
ArrayIndexOutOfBoundsException异常
则显示,如果不抛出异常则不显示。 - null,产生NullPointerException
- cast,尝试将String对象强制转化为Integer对象,产生ClassCastException。
- num,然后输入字符,转化为Integer,如果抛出NumberFormatException异常则显示。
- 其他,结束程序。
输入样例:
在这里给出一组输入。例如:
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方法:
- 输入
new
则新建学生对象。然后输入一行学生数据,格式为姓名 年龄
,接着调用setName,addScore。否则跳出循环。 - setName不成功则抛出异常,并打印异常信息,然后继续下一行的处理。
- addScore不成功则抛出异常,并打印异常信息,然后继续下一行的处理。如果2、3都成功,则打印学生信息(
toString
) - 如果在解析学生数据行的时候发生其他异常,则打印异常信息,然后继续下一行的处理。
- 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());
}
}
}