java自定义异常

1

题目

自行编码产生常见异常。

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

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

2

题目

使用异常处理输入机制,让程序变得更健壮。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

3

题目
前言
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;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Code Writers

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

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

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

打赏作者

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

抵扣说明:

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

余额充值