一、选择题
1.以下关于异常的代码的执行结果是( C )。
public class Test {
public static void main(String args[]) {
try {
System.out.print("try");
return;
} catch(Exception e){
System.out.print("catch");
}finally {
System.out.print("finally");
}
}
}
A.try catch finally
B.catch finally
C.try finally
D.try
解析
即使try语句块中出现了return,还是会执行finally语句块的
2.在异常处理中,如释放资源、关闭文件等由( C )来完成。
A. try子句
B.catch子句
C.finally子句
D.throw子句
3.阅读如下Java代码,其中错误的行是(AC)。
public class Student {
private String stuId;
public void setStuId(String stuId) throw Exception { // 1
if (stuId.length() != 4) { // 2
throws new Exception("学号必须为4位!"); // 3
} else {
this.stuId = stuId; //4
}
}
}
A.1
B.2
C.3
D.全部正确
解析
1处为throws
3处为throw
4.下面选项中属于运行时异常的是(BC)。
A.Exception和SexException
B.NullPointerException和InputMismatchException
C.ArithmeticException和ArrayIndexOutOfBoundsException
D.ClassNotFoundException和ClassCastException
解析
A中:
Exception类是所有异常类的父类,包括RuntimeException 运行时异常和CheckedException 已检查异常
SexException,不知道是个啥,可能是自己定义的异常类(要看你具体继承的是什么异常类)
B中:
NullPointerException 当程序运行时,对象未初始化或为空时,NullPointerException就出现(运行时异常)
InputMismatchException Scanner读入的字符与我们的变量类型不同导致的(运行时异常)
java.lang.Object
----java.lang.Throwable
--------java.lang.Exception
------------java.lang.RuntimeException
----------------java.util.NoSuchElementException
--------------------java.util.InputMismatchException
C中:
ArithmeticException 出现异常的运算条件时,抛出此异常。(运行时异常)
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出 (运行时异常)
D中:
ClassCastException 试图将对象强制转换为不是实例的子类时,抛出该异常(运行时异常)
ClassNotFoundException 无法找到指定的类异常。(不是运行时异常)
java.lang.Object
----java.lang.Throwable
--------java.lang.Exception
------------java.lang.ReflectiveOperationException
----------------java.lang.ClassNotFoundException
5.阅读如下Java代码,在控制台输入"-1",执行结果是(B)。
public class Demo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入数字:");
try {
int num = input.nextInt();
if (num < 1 || num > 4) {
throw new Exception("必须在1-4之间!");
}
} catch (InputMismatchException e) {
System.out.println("InputMismatchException");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
A.输出:InputMismatchException
B.输出:必须在1-4之间!
C.什么也没输出
D.编译错误
解析
只触发了自定义异常,没有触发InputMismatchException,此异常是Scanner读入的字符与我们的变量类型不同导致的,而-1属于int型,故没有触发该异常。
二、简答题
1. Error和Exception的区别。
-
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
-
Exception是程序本身能够处理的异常
2. Checked异常和Runtime异常的区别。
- CheckedException: 这类异常在编译时就必须做出处理,否则无法通过编译,所有不是RuntimeException的都属于CheckedException,要么使用“try/catch”捕获异常、要么使用“throws”声明异常。
- RuntimeException:这类异常通常是由编程错误导致的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,经常需要通过增加“逻辑处理来避免这些异常”。
3. Java异常处理中,关键字try、catch、finally、throw、throws分别代表什么含义?
- 用try来执行一段程序
- 如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它
- 最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行(catch语句可有多条;finally语句最多只能有一条,根据自己的需要可有可无)。
- throw指抛出的一个具体的异常类型
- throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。
4. throws和throw的区别。
- throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。
- throw指抛出的一个具体的异常类型
三、编码题
1. 编写程序接收用户输入分数信息,如果分数在0—100之间,输出成绩。如果成绩不在该范围内,抛出异常信息,提示分数必须在0—100之间。
要求:使用自定义异常实现。
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* 接受用户输入,判断范围,抛出异常
* @author Jeloys
*/
public class Homework1 {
public static void main(String[] args) {
System.out.println("请输入分数!");
Scanner scanner = new Scanner(System.in);
try {
int grade = scanner.nextInt();
if (grade < 0 || grade > 100) {
throw new Exception("分数必须在0—100之间");
}
} catch (InputMismatchException e) {
// TODO: handle exception
System.out.println("请按照格式输入一个整数");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
} finally {
scanner.close();
}
}
}
上面这个好像没按照要求写,那重写一个自定义异常类。
import java.util.Scanner;
public class Homework1 {
public static void main(String[] args) {
System.out.println("请输入学生的姓名和成绩,中间用空格隔开");
Student student = new Student();
Scanner scanner = new Scanner(System.in);
try {
String input = scanner.nextLine();
//用一个数组存储姓名和分数
String[] strArr = input.split(" ");
String name = strArr[0];
int grade = Integer.parseInt(strArr[1]);
student.setName(name);
student.setGrade(grade);
} catch (IllegalGradeException e) {
// TODO: handle exception
e.printStackTrace();
} finally {
scanner.close();
System.out.println(student.toString());
}
}
}
class IllegalGradeException extends Exception {
// 默认构造器
public IllegalGradeException() {
}
// 重载构造器
public IllegalGradeException(String message) {
super(message);
}
}
class Student {
private int grade;
private String name;
public void setGrade(int grade) throws IllegalGradeException {
if (grade < 0 || grade > 100) {
throw new IllegalGradeException("分数必须在0—100之间");
}
this.grade = grade;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name = " + name + ", grade=" + grade + "]";
}
}
2. 写一个方法void isTriangle(int a,int b,int c),判断三个参数是否能构成一个三角形, 如果不能则抛出异常IllegalArgumentException,显示异常信息 “a,b,c不能构成三角形”,如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数, 调用此方法,并捕获异常。
import java.util.Scanner;
public class Homework2 {
public static void main(String[] args) throws IllegalArgumentException {
System.out.println("请输入三角形的三条边的长度,中间用空格隔开");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
String[] inputArr = input.split(" ");
int a = Integer.parseInt(inputArr[0]);
int b = Integer.parseInt(inputArr[1]);
int c = Integer.parseInt(inputArr[2]);
isTriangle(a, b, c);
scanner.close();
}
static void isTriangle(int a, int b, int c) throws IllegalArgumentException {
if (a < 0 | b < 0 | c < 0) {
throw new IllegalArgumentException("a,b,c不能构成三角形");
} else if (a + b > c && a + c > b && b + c > a) {
System.out.println("创建三角形成功!边长分别为:" + a + "," + b + "," + c);
} else {
throw new IllegalArgumentException("a,b,c不能构成三角形");
}
}
}
class IllegalArgumentException extends Exception {
// 默认构造器
public IllegalArgumentException() {
}
// 重载构造器
public IllegalArgumentException(String message) {
super(message);
}
}
3. 编写一个计算N个学生分数平均分的程序。程序应该提示用户输入N的值,如何必须输入所有N个学生分数。如果用户输入的分数是一个负数,则应该抛出一个异常并捕获,提示“分数必须是正数或者0”。并提示用户再次输入该分数。
import java.util.Scanner;
import week4.Homework11;
public class Homework3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = 0;
System.out.print("请输入学生人数");
num = scanner.nextInt();
Student[] student;
student = new Student[num];
int total_grade = 0;
double average_grade = 0.0;
int grade = 0;
for (int i = 0; i < student.length; i++) {
try {
System.out.print("请输入第" + (i + 1) + "位学生的分数:");
grade = scanner.nextInt();
Student stu = new Student();
student[i] = stu;
student[i].setGrade(grade);
total_grade += grade;
} catch (IllegalGradeException e) {
e.printStackTrace();
i--;
continue;
}
}
average_grade = total_grade * 1.0 / num;
System.out.println("班级学生平均分为:" + average_grade);
scanner.close();
}
}