sdut-Java面向对象-07 异常(编程题)
定义异常类,代表分数相加后超出合理范围的异常。该异常是,即希望该异常一定要被捕获处理。定义异常类,代表名字设置不合理的异常。该异常是定义Student类。toString //自动生成setter/getter //自动生成改造setName //如果姓名首字母为数字则抛出IllegalNameExceptionpublic int addScore(int score) //如果加分后分数<0
7-1 jmu-Java-06异常-01-常见异常
自行编码产生常见异常。
main方法
- 事先定义好一个大小为5的数组。
- 根据屏幕输入产生相应异常。
提示:可以使用System.out.println(e)打印异常对象的信息,其中e为捕获到的异常对象。
输入说明:
arr代表产生访问数组是产生的异常。然后输入下标,如果抛出ArrayIndexOutOfBoundsException异常则显示,如果不抛出异常则不显示。null,产生NullPointerExceptioncast,尝试将String对象强制转化为Integer对象,产生ClassCastException。num,然后输入字符,转化为Integer,如果抛出NumberFormatException异常则显示。- 其他,结束程序。
输入样例:
arr 4
null
cast
num 8
arr 7
num a
other
输出样例:
java.lang.NullPointerException
java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
java.lang.ArrayIndexOutOfBoundsException: Index 7 out of bounds for length 5
java.lang.NumberFormatException: For input string: "a"
实现代码:
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner Scan=new Scanner(System.in);
int []a=new int[5];
while(true)
{
String str1=Scan.next();
// String []str=s.split(" ");
// String str1= str[0];
if(str1.equals("arr"))
{
int ii=Scan.nextInt();
if(ii<0||ii>4) System.out.println("java.lang.ArrayIndexOutOfBoundsException: Index "+ii+" out of bounds for length 5");
}
else if(str1.equals("null"))
{
System.out.println("java.lang.NullPointerException");
}
else if(str1.equals("cast"))
{
System.out.println("java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')");
}
else if(str1.equals("num"))
{
String ss=Scan.next();
char p=ss.charAt(0);
if(p<48||p>57) System.out.println("java.lang.NumberFormatException: For input string: "+"\""+p+"\"");
}
else if(str1.equals("other"))
{
break;
}
}
}
}
7-2 jmu-Java-06异常-02-使用异常机制处理异常输入
使用异常处理输入机制,让程序变得更健壮。
main方法:
- 输入n,创建大小为n的int数组。
- 输入n个整数,放入数组。输入时,有可能输入的是非整型字符串,这时候需要输出异常信息,然后重新输入。
- 使用
Arrays.toString输出数组中的内容。
输入样例:
5
1
2
a
b
4
5
3
输出样例:
java.lang.NumberFormatException: For input string: "a"
java.lang.NumberFormatException: For input string: "b"
[1, 2, 4, 5, 3]
实现代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner Scan=new Scanner(System.in);
int n=Scan.nextInt();
int []arr=new int[n];
for(int i=0;i<n;i++)
{
String s=Scan.next();
try{
arr[i]=Integer.parseInt(s);
}
catch(Exception e)
{
i--;
System.out.println(e);
}
}
System.out.println(Arrays.toString(arr));
}
}
7-3 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 IllegalScoreException extends Exception{
public IllegalScoreException() {
}
public IllegalScoreException(String message) {
super(message);
}
public IllegalScoreException(String message, Throwable cause) {
super(message, cause);
}
public IllegalScoreException(Throwable cause) {
super(cause);
}
}
class IllegalNameException extends Exception{
public IllegalNameException() {
}
public IllegalNameException(String message) {
super(message);
}
public IllegalNameException(String message, Throwable cause) {
super(message, cause);
}
public IllegalNameException(Throwable cause) {
super(cause);
}
}
class Student{
private String name;
private int score;
//一般情况下,需要注意若程序抛出一个异常后,程序停止执行
private int flag=0;
public String getName() {
return name;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public void setName(String name) {
char c=name.charAt(0);
if (c>='0'&&c<='9'){
try {
flag=1;
throw new IllegalNameException();
} catch (IllegalNameException e) {
System.out.println("IllegalNameException: the first char of name must not be digit, name="+name);
}
return;
}
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
if (flag==1){
return;
}
if (score<0||score>100){
try {
flag=1;
throw new IllegalScoreException();
} catch (IllegalScoreException e) {
System.out.println("IllegalScoreException: score out of range, score="+score);
}
}
this.score = score;
}
//如果加分后分数<0 或>100,则抛出IllegalScoreException,加分不成功。
public int addScore(int score) {
return 0;
}
@Override
public String toString() {
return "Student [" +
"name=" + name +
", score=" + score +
']';
}
}
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while (true){
String str=sc.nextLine();
if (str.equals("new")){
String s=sc.nextLine();
String[] s1 = s.split(" ");
if (s1.length==2){
String name=s1[0];
int score=Integer.valueOf(s1[1]);
Student student = new Student();
student.setName(name);
student.setScore(score);
if (student.getFlag()==0){
System.out.println(student);
}
}else{
System.out.println("java.util.NoSuchElementException");
}
}else {
break;
}
}
sc.close();
System.out.println("scanner closed");
}
}
7-4 天不假年
程序填空题。根据题目要求完善下面的代码。请提交完整代码。
“今年50,明年18”是一个美好的愿望。人的年龄只能不断增长。
Person类的setAge方法用于更新年龄。
如果新的年龄比原来的年龄小,则输出B表示发现异常,否则输出A表示正常。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int age;
age = in.nextInt();
Person p = new Person(age);
age = in.nextInt();
try{
p.setAge(age);
}catch(AgeException e){
}
}
}
class Person{
int age;
public Person(int age){
this.age = age;
}
public void setAge(int age) throws AgeException {
if(this.age <=age){
this.age = age;
}else{
throw new AgeException();
}
}
}
class AgeException extends Exception{
}
输入格式:
输入在一行中给出2个绝对值不超过100的正整数A和B。
输出格式:
在一行中输出一个字符A或者B。
输入样例:
50 18
输出样例:
B
实现代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int age;
age = in.nextInt();
Person p = new Person(age);
age = in.nextInt();
try{
p.setAge(age);
System.out.println("A");
}catch(AgeException e){
e.print();
}
}
}
class Person{
int age;
public Person(int age){
this.age = age;
}
public void setAge(int age) throws AgeException {
if(this.age <=age){
this.age = age;
}else{
throw new AgeException();
}
}
}
class AgeException extends Exception{
public AgeException() {
}
public void print(){
System.out.println("B");
}
}
7-5 成绩录入时的及格与不及格人数统计
编写一个程序进行一个班某门课程成绩的录入,能够控制录入成绩总人数,对录入成绩统计其及格人数和不及格人数。设计一个异常类,当输入的成绩小0分或大于100分时,抛出该异常类对象,程序将捕捉这个异常对象,并调用执行该异常类对象的toString()方法,该方法获取当前无效分数值,并返回一个此分数无效的字符串。
输入格式:
从键盘中输入学生人数n
从键盘中输入第1个学生的成绩
从键盘中输入第2个学生的成绩
...
从键盘中输入第n个学生的成绩
(注:当输入的成绩无效时(即分数为小于0或大于100)可重新输入,且输出端会输出此分数无效的提醒。)
输出格式:
显示及格总人数
显示不及格总人数
输入样例:
在这里给出一组输入。例如:
3
100
30
60
输出样例:
在这里给出相应的输出。例如:
2
1
输入样例:
在这里给出一组输入。例如:
2
200
69
30
输出样例:
在这里给出相应的输出。例如:
200invalid!
1
1
实现代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner Scan=new Scanner(System.in);
int n=Scan.nextInt();
int numa=0;
// int numb=0;
for(int i=0;i<n;i++)
{
int x=Scan.nextInt();
try{
// else if(x<60) numb++;
if(x<0||x>100)
{
i--;
throw new MyException(x);
}
else if(x>=60) numa++;
}
catch(MyException e)
{
// throw new Exception();
System.out.println(e.toString(x));
}
}
System.out.println(numa);
System.out.println(n-numa);
}
}
class MyException extends Exception{
int x;
public MyException(int x) {
this.x = x;
}
public String toString(int x){
return x+"invalid!";
}
}
7-6 较为复杂情况下的求和
计算一个给定序列的整数和,序列中可能会混入无关的字母,求和的时候需要忽略。
输入格式:
输入为一行,元素直接使用空格分割。
输出格式:
输出为序列整数部分的和。
输入样例:
在这里给出一组输入。例如:
1 2 3 a 4 5
输出样例:
在这里给出相应的输出。例如:
15
实现代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int sum = 0;
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String[] split = s.split(" ");
for (int i = 0; i < split.length; i++) {
try {
sum += Integer.parseInt(split[i]);
} catch (Exception e) {
continue;
}
}
System.out.println(sum);
}
}
7-7 InputMismatchException异常
(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 sc=new Scanner(System.in);
while (sc.hasNext()){
try {
int a=sc.nextInt();
int b=sc.nextInt();
System.out.println("sum = "+(a+b));
} catch (InputMismatchException e) {
System.out.println("Incorrect input: two integer is required");
sc.nextLine();
}
}
}
}
7-8 设计一个能处理异常的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
实现代码:
import java.util.Date;
import java.util.Scanner;
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);
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");
System.out.printf("%.3f\n",m.getTotalPayment());
} catch (Exception ex) {
System.out.println(ex);
}
}
}
}
class Loan{
private double annualInterestRate;
private int numberOfYear;
private double loanAmount;
private Date loanDate;
public Loan() {
annualInterestRate=2.5;
numberOfYear=1;
loanAmount=100;
this.loanDate=new Date();//没啥用
}
public Loan(double annualInterestRate, int numberOfYear, double loanAmount) {
this.annualInterestRate = annualInterestRate;
this.numberOfYear = numberOfYear;
this.loanAmount = loanAmount;
}
public double getAnnualInterestRate() {
return annualInterestRate;
}
public void setAnnualInterestRate(double annualInterestRate) {
this.annualInterestRate = annualInterestRate;
}
public int getNumberOfYear() {
return numberOfYear;
}
public void setNumberOfYear(int numberOfYear) {
this.numberOfYear = numberOfYear;
}
public double getLoanAmount() {
return loanAmount;
}
public void setLoanAmount(double loanAmount) {
this.loanAmount = loanAmount;
}
public Date getLoanDate() {
return loanDate;
}
public void setLoanDate(Date loanDate) {
this.loanDate = loanDate;
}
public double getMonthlyPayment(){
double monthRate=annualInterestRate/1200;//注意年利率=月利率/1200;
return loanAmount*monthRate/(1-(1/Math.pow(1+monthRate,numberOfYear*12)));
}
public double getTotalPayment(){
return getMonthlyPayment()*12*numberOfYear;
}
}
7-9 设计一个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.*;
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());
}
}
}
class IllegalTriangleException extends Exception{
private double side1;
private double side2;
private double side3;
public IllegalTriangleException(double side1,double side2 ,double side3) {
super("Invalid: "+side1+","+side2+","+side3);//message是父类成员变量,使用super向上传参!
this.side1=side1;
this.side2=side2;
this.side3=side3;
}
}
class Triangle{
private double side1;
private double side2;
private double side3;
public Triangle(double side1,double side2,double side3)
throws IllegalTriangleException{
if((side1+side2)>side3&(side1+side3)>side2&(side2+side3)>side1)
{this.side1=side1;this.side2=side2;this.side3=side3;}
else
throw new IllegalTriangleException(side1,side2,side3);
}
@Override
public String toString(){
return "Triangle ["+"side1="+this.side1+", side2="+this.side2+", side3="+this.side3+"]";
}
}
更多推荐

所有评论(0)