Java编程练习6

7-1 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: 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”
注意
异常分析:
ArrayIndexOutOfBoundsException----数组越界访问时出现的异常
NullPointerException----使用空指针时出现的异常 也就是访问一个空地址时出现的异常
ClassCastException----类之间强制转换时会出现的异常 本题表现为String对象强制转化为Integer对象 这里制造该异常的时候会出现报错,所以我们用Object(Object相当于所有类的父类)接收String,然后就可以进行强制转换,因为编译器中不知道Object中存储的类是什么
NumberFormatException----当 Java 在将 String 字符串转换为数字的时候,如果遇到没有办法转换的情况,Java 将会抛出一个 NumberFormatException 异常 本题中可采取Integer.parseInt()进行转换
正确答案

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int[] a=new int [5];
		int b;
		String s=null;
		Integer d=null;
		while(!((s=in.next()).equals("other"))) {
			try {
				
				if(s.equals("arr")) {
					b=in.nextInt();
					a[b]=0;
				}
				if(s.equals("null")) {
					String x=null;
					x.charAt(0);
				}
				if(s.equals("cast")) {
					Object c="123";
					d=(Integer)c;
				}
				if(s.equals("num")) {
					String str = in.next();
					d=Integer.parseInt(str);
				}
			}catch(ArrayIndexOutOfBoundsException e) {
				System.out.println(e);
			}catch(NullPointerException e) {
				System.out.println(e);
			}catch(ClassCastException e) {
				System.out.println(e);
			}catch(NumberFormatException e) {
				System.out.println(e);
			}catch(Exception e) {
				System.out.println(e);
			}
		}
	}
}

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 in = new Scanner(System.in);
		int n=in.nextInt();
		int[] a=new int[n];
		for(int i=0;i<n;i++) {
			try {
				a[i]=Integer.parseInt(in.next());
			}catch(Exception e) {
				i--;
				System.out.println(e);
			}
		}
		System.out.println(Arrays.toString(a));
	}
}

7-3 jmu-Java-06异常-03-throw与throws

题目
前言
C语言中一般通过返回错误代码来表示一个函数执行是否有误。然而有的时候错误返回值可能与正常值相混淆。
Java中使用异常来表示程序运行中发生的错误。本实验的主要目的为了演示使用异常机制替代错误返回值。

题目内容
编写类ArrayUtils
方法:public static double findMax(double[] arr,int begin, int end)
方法功能:用来返回arr数组中在下标begin与end-1之间(包括end-1)的最大值。
注意:必须使用throws关键字声明findMax。
方法说明:

要求begin<end,否则抛出相应的异常(IllegalArgumentException)。
begin不得小于0,end不得大于arr.length,否则也抛出异常。
注意:抛出异常时,应让用户知道错误发生的原因。

main方法:
输入n,创建大小为n的int数组。
输入n个整数,放入数组。
输入若干对整数,代表begin与end,然后调用ArrayUtils.findMax方法。当输入的不是整数类型字符串,则退出输入循环。
最后使用如下代码打印标识信息
try {
System.out.println(ArrayUtils.class.getDeclaredMethod(“findMax”, double[].class,int.class,int.class));
} catch (Exception e1) {
}
输入样例:
5
1 3 5 6 8
0 5
3 3
3 4
3 2
-1 3
0 6
end
输出样例:
8.0
java.lang.IllegalArgumentException: begin:3 >= end:3
6.0
java.lang.IllegalArgumentException: begin:3 >= end:2
java.lang.IllegalArgumentException: begin:-1 < 0
java.lang.IllegalArgumentException: end:6 > arr.length
//这里是标识信息
正确答案

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n=in.nextInt();
		double[] a=new double[n]; 
		for(int i=0;i<n;i++) {
			a[i]=in.nextDouble();
		}
		in.nextLine();
		String[] s=null;
		while(in.hasNextInt()) {
			s=in.nextLine().split(" ");
			int x=Integer.valueOf(s[0]);
			int y=Integer.valueOf(s[1]);
			
			try {
				System.out.println(ArrayUtils.findMax(a,x,y));
			}catch(Exception e) {
				System.out.println(e);
			}
		}
		try {
		     System.out.println(ArrayUtils.class.getDeclaredMethod("findMax", double[].class,int.class,int.class));
		} catch (Exception e1) {
		} 

	}
}
class ArrayUtils{
	public static double findMax(double[] arr,int begin, int end) throws IllegalArgumentException{
		if (begin>=end) throw new IllegalArgumentException("begin:"+begin+" >= end:"+end+"");
		if (begin<0) throw new IllegalArgumentException("begin:"+begin+" < 0");
		if (end>arr.length) throw new IllegalArgumentException("end:"+end+" > arr.length");
		double max=arr[begin];
		for(int i=begin+1;i<end;i++) {
			if(arr[i]>max) {
				max=arr[i];
			}
		}
		return max;
	}
}

7-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;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.nextLine().equals("new")) {
			Student student=new Student();
			student.flag=true;
			String[] s=in.nextLine().split(" ");
			student.setName(s[0]);
			try {
				student.addScore(Integer.parseInt(s[1]));
			}catch(Exception e) {
				student.flag=false;
				System.out.println("java.util.NoSuchElementException");
			}
			
			if(student.flag) System.out.println(student.toString());
		}
		in.close();
		System.out.println("scanner closed");
	}
}
class Student{
	private String name;
	private int score;
	boolean flag=true;
	public String getName() {
		return name;
	}
	public void setName(String name){
		if(name.charAt(0)>='0'&&name.charAt(0)<='9') {
			try {
				throw new IllegalNameException("the first char of name must not be digit, name="+name);
			}catch(Exception e){
				flag=false;
				System.out.println(e);
			}
		}
		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){
		if(this.score+score>100||this.score+score<0) {
			try {
				throw new IllegalScoreException("score out of range, score="+(this.score+score));
			}catch(Exception e) {
				flag=false;
				System.out.println(e);
			}
		}
		this.score+=score;
		return this.score;
	}
}
class IllegalScoreException extends RuntimeException {
	IllegalScoreException(){
		
	}
	IllegalScoreException(String message){
		super(message);
	}
	
}
class IllegalNameException extends RuntimeException {
	IllegalNameException(){
		
	}
	IllegalNameException(String message){
		super(message);
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

漠–

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

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

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

打赏作者

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

抵扣说明:

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

余额充值