自己编码以产生常见异常。
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: java.lang.String cannot be cast to java.lang.Integer
java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.NumberFormatException: For input string: "a"
异常处理学的不好,第一道题思路不清晰,参见:https://blog.csdn.net/weixin_48419914/article/details/121228852
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int []nums = new int[5];
Scanner in = new Scanner(System.in);
String str = in.next();
while(str.equals("other")==false) {
try {
if(str.equals("null")) {
throw new NullPointerException();
}
else if(str.equals("arr")) {
int index = in.nextInt();
if(index>4||index<0) {
throw new ArrayIndexOutOfBoundsException(""+index);
}
}
else if(str.equals("cast")) {
throw new ClassCastException("java.lang.String cannot be cast to java.lang.Integer");
}
else if(str.equals("num")) {
String num = in.next();
if(!(num.charAt(0)>='0'&&num.charAt(0)<='9')) {
throw new NumberFormatException("For input string: \""+num+"\"");
}
}
}catch (Exception e) {
System.out.println(e);
}
str = in.next();
}
}
}
使用异常处理输入机制,让程序变得更健壮。
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 sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
try {
String num = sc.next();
arr[i] = Integer.parseInt(num);
} catch (Exception e) {
System.out.println(e);
i--;
}
}
System.out.println(Arrays.toString(arr));
}
}
定义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 sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.next();
if (str.equals("new") == false) {
sc.close();
System.out.println("scanner closed");
break;
}
Student stu = new Student();
sc.nextLine();
String[] msg = sc.nextLine().split(" ");
try {
String name = msg[0];
int score = Integer.parseInt(msg[1]);
stu.setName(name);
stu.addScore(score);
System.out.println(stu);
} catch (IllegalScoreException e) {
System.out.println(e);
} catch (IllegalNameException e) {
System.out.println(e);
} catch (Exception e) {
System.out.println("java.util.NoSuchElementException");
}
}
}
}
class IllegalScoreException extends Exception {
String msg;
public IllegalScoreException(String msg) {
this.msg = msg;
}
public String toString() {
return "IllegalScoreException: score out of range, score=" + msg;
}
}
class IllegalNameException extends RuntimeException {
String msg;
public IllegalNameException(String msg) {
this.msg = msg;
}
public String toString() {
return "IllegalNameException: the first char of name must not be digit, name=" + msg;
}
}
class Student {
private String name;
private int score;
@Override
public String toString() {
return "Student [" +
"name=" + name +
", score=" + score +
']';
}
public int addScore(int score) throws IllegalScoreException {
if (this.score + score < 0 || this.score + score > 100)
throw new IllegalScoreException(Integer.toString(this.score + score));
setScore(this.score + score);
return 0;
}
public String getName() {
return name;
}
public void setName(String name) {
if (name.charAt(0) >= '0' && name.charAt(0) <= '9')
throw new IllegalNameException(name);
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
程序填空题。根据题目要求完善下面的代码。请提交完整代码。
“今年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);
}catch(AgeException e){
System.out.println(e.getMessage());
}
}
}
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;
System.out.println("A");
}else{
throw new AgeException("B");
}
}
}
class AgeException extends Exception{
public AgeException(String msg){
super(msg);
}
}
编写一个程序进行一个班某门课程成绩的录入,能够控制录入成绩总人数,对录入成绩统计其及格人数和不及格人数。设计一个异常类,当输入的成绩小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 sc = new Scanner(System.in);
int n = sc.nextInt();
int yes = 0;
int no = 0;
for (int i = 0; i < n; i++) {
int score = sc.nextInt();
try {
if (score < 0 || score > 100) {
throw new IllegalScoreException(Integer.toString(score));
} else {
if (score >= 60) {
yes++;
} else {
no++;
}
}
} catch (IllegalScoreException e) {
System.out.println(e);
i--;
}
}
System.out.println(yes + "\n" + no);
}
}
class IllegalScoreException extends Exception {
String msg;
public IllegalScoreException(String msg) {
this.msg = msg;
}
public String toString() {
return msg + "invalid!";
}
}