7-1 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: 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方法:

  1. 输入n,创建大小为n的int数组。
  2. 输入n个整数,放入数组。输入时,有可能输入的是非整型字符串,这时候需要输出异常信息,然后重新输入。
  3. 使用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方法

  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 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+"]";
        }
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐