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