1.阅读下列程序代码段:
try {
RandomAccessFile raf = new RandomAccessFile(“c:/a.txt”, “rw”);
raf.write(‘A’); //write()写的是int的低八位,一个字节,这里进行了自动转型
raf.writeInt(300);//writeInt()写入一个int型,写入四个字节
System.out.println(raf.getFilePointer());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace(); }
该程序输出的结果是( )。
A.1
B.2
C.5
D.4
2.在异常处理中,如释放资源、关闭文件、关闭数据库连接等由( )来完成。
A.try子句//try{可能出现异常的代码片段}
B.catch子句catch捕获try中可能出现的异常
C.finally子句
D.throw子句
3.下列异常类中,属于RuntimeException的子类的是:( )。
A.FileNotFoundException
B.IOException // CheckedException,编译时异常
C.ClassCastException // 向下造型时,转型对象不是通过向上造型而来的
D.ArrayIndexOutOfBoundsException
4.对于catch子句的排列,下列哪种是正确的( )
A.父类在先,子类在后
B.子类在先,父类在后
C.有继承关系的异常不能在同一个try程序段内
D.只能有子类异常
5.String[] arr = new String[3];
System.out.println(arr[0].length());
运行结果是( )。
A.会出现编译错误。
B.运行期会抛出ArithmeticException异常
C.运行期会抛出IOException异常
D.运行期会抛出NullPointerException异常// 引用类型初始值为null,
6.下列代码编译和运行的结果是:( )。
public static void main(String[] args) {
try {
String[] s=null;
s[0] = “test”;//运行才会NullPointerException
System.out.println(s[0]);
} catch (Exception ex) {
System.out.println(“Exception”);
} catch (NullPointerException npe) {//编译报错。
System.out.println(“NullPointerException”);
}
}
A.输出:test
B.输出:Exception
C.编译失败
D.输出:NullPointerException
解析:C。 catch (NullPointerException npe) 编译报错,多个catch的异常之间若存在继承关系,一定要先捕获子类异常,再捕获超类异常,否则编译不通过。异常之间没有关系捕获异常时可以随意声明位置
简答题
1.java中的异常处理机制有几种?怎么实现?
答:处理机制有两种:
一:使用try-catch捕获并处理异常
实现:
try{
可能出现异常的代码块
}catch(XXXException e){
处理try中出现的XXXException的代码方案
}
二:使用throws抛出异常。由调用者处理该异常,调用者也可以继续往外抛出该异常或者使用try-catch处理
2.Error和Exception的区别
Error 是系统级错误,是Java运行环境内部错误或者硬件问题,不能通过程序来处理这样的问题,发生错误时程序退出运行。它是Java虚拟机抛出的,比如虚拟机内存溢出等
Exception是程序需要处理的异常,由于程序设计的不完善(程序员逻辑问题)而出现的问题,程序必须进行处理,比如空指针异常,数组下标越界异常等。
通常程序中处理的异常都是Exception
3.RuntimeException和CheckedException的区别
CheckedException是编译时异常(检查异常),java 语言强制要求处理的所有非运行时异常,例如IOException ,SQLException
运行时异常(非检查异常 UnChecked) --RuntimeException,一般是由于程序逻辑错误引起的,比如算术异常,空指针异常等。
4.final、finally、finalize的区别
final 可以修饰属性,方法,类。
final修饰属性为常量,初始化后不可被修改。
final修饰方法可被继承不能被重写。
final 修饰类不能被继承。
finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带着一个语句块,在系统没有在中断(System.exit(0))情况下,表示这段语句最终一定被执行,经常被用在需要释放资源,关闭文件,关闭数据库连接
finalize是方法名,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
5.throw 与 throws 的区别
区别:
1.throw 声明位置在方法体内,后面跟的是异常类的实例(new XXXException(”异常信息描述“)),只能有一个;
throws 声明位置在方法声明后,后面跟的是异常类名。
2.throw 后面只能抛出一个异常对象名,throws同时抛出多个异常时中间用“,”逗号隔开。
throw 和 throws 联系:
1.如果方法中有throw 抛出的RuntimeException 及其子类对象,则方法声明上可以没有throws,(由该方法的调用者处理该异常),除此之外,方法声明上必须有throws
6.java 中如何编写自定义异常?
定义自定义异常 需要注意以下几点:
1.类名定义时要做到见名知意
2.需要继承自Exception,直接或间接继承都可以
3.提供继承自Exception中提供的所有构造器
7.说出9个常见的异常。
①数字格式异常NumberFormatException
②算术异常ArithmeticException
③数组下标越界异常ArraysIndexOutOfBounds
④字符串下标越界异常StringIndexOutOfBounds
⑤空指针异常NullPointerException
⑥类型格式异常ClassFormatException
⑦文件找不到异常NotFoundFileException
⑧引用类型强制转换异常ClassCastException
⑨IllegalArgumentException非法参数异常
编程题
1.模拟用户登录案例。接收用户输入的账号、密码,封装login方法用于验证登录。 --数据可自行模拟
如果账号密码均正确,显示登录成功,否则抛出对应异常,并给出提示信息。
- 注:需自定义两个异常UserNameNFException(用户名未找到异常)、PwdNFException(密码未找到异常),分别处理用户名的错误和密码的错误。
/**
* 1.模拟用户登录案例。接收用户输入的账号、密码,封装login方法用于验证登录。 --数据可自行模拟
* 如果账号密码均正确,显示登录成功,否则抛出对应异常,并给出提示信息。
* 注:需自定义两个异常UserNameNFException(用户名未找到异常)、PwdNFException(密码未找到异常),
* 分别处理用户名的错误和密码的错误。
* @author yyc
* 2021/9/18 17:37
*/
public class TestLogin {
public static void main(String[] args) throws UserNameNFException, PwdNFException {
User[] users = new User[3];
users[0] = new User("1474734090", "123abc");
users[1] = new User("2982046836", "abc123");
users[2] = new User("3240935383", "123456");
Scanner scan = new Scanner(System.in);
System.out.println("请输入账号:");
String id = scan.nextLine();
System.out.println("请输入密码:");
String password = scan.nextLine();
User cust = new User(id,password);
for (int i = 0; i < users.length; i++){
if (cust.Login(users)){
System.out.println("登陆成功!");
break;
}
}
}
}
package JAVA_API.Num13_Exception.exceptionhomework;
import java.util.Objects;
/*
* 1.模拟用户登录案例。接收用户输入的账号、密码,封装login方法用于验证登录。 --数据可自行模拟
* 如果账号密码均正确,显示登录成功,否则抛出对应异常,并给出提示信息。
* * 注:需自定义两个异常UserNameNFException(用户名未找到异常)、PwdNFException(密码未找到异常),分别处理用户名的错误和密码的错误。
* @author yyc
* 2021/9/18 17:34
*/
public class User {
private String id;
private String password;
public User() {
}
public User(String id, String password) {
this.id = id;
this.password = password;
}
//如果账号密码均正确,显示登录成功,否则抛出对应异常,并给出提示信息。
public boolean Login(User[] users) throws PwdNFException, UserNameNFException {
for (int i = 0; i < users.length;i++){
if (this.id.equals(users[i].id)){
if (this.password.equals(users[i].password)){
return true;
}else{
throw new PwdNFException("密码错误!");
}
}else if (i == users.length-1){
throw new UserNameNFException("用户不存在");
}
}
return false;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", password='" + password +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(password, user.password);
}
}
package JAVA_API.Num13_Exception.exceptionhomework;
/**
* * 定义自定义异常 需要注意以下几点:
* * 1.类名定义时要做到见名知意
* * 2.需要继承自Exception,直接或间接继承都可以
* * 3.提供继承自Exception中提供的所有构造器
* *
* UserNameNFException 用户名未找到异常
* 当用户未找到时抛出该异常
* @author yyc
* 2021/9/19 15:40
*/
public class UserNameNFException extends Exception{
public UserNameNFException() {
}
public UserNameNFException(String message) {
super(message);
}
public UserNameNFException(String message, Throwable cause) {
super(message, cause);
}
public UserNameNFException(Throwable cause) {
super(cause);
}
public UserNameNFException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
package JAVA_API.Num13_Exception.exceptionhomework;
/**
* @author yyc
* 2021/9/19 15:44
*/
public class PwdNFException extends Exception{
public PwdNFException() {
}
public PwdNFException(String message) {
super(message);
}
public PwdNFException(String message, Throwable cause) {
super(message, cause);
}
public PwdNFException(Throwable cause) {
super(cause);
}
public PwdNFException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}