文章目录
一、异常
1、什么是异常
- 异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
- Java编程语言使用异常处理机制为程序提供了错误处理的能力
2、异常处理
Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw. throws
一、try catch
二、try catch finally
- 在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行【除非干掉了虚拟机】 在 return 前执行
- try-catch-finally 也可以嵌套try-catch-finally 实现更精确的异常控制。
如果finally 块中有返回语句,finally 的返回内容会覆盖try 或 catch块中的返回内容。 - 注意:finally块中不能修改返回值,但可以修改返回对象的内容。
- finally主要执行close方法,可以使用try(具有close方法的对象)来省略finally
public class demo01 {
public static void main(String[] args) {
System.out.print("请输入年龄:");
// 自动执行finally -- > close
try(Scanner scanner = new Scanner(System.in)) {
int age = scanner.nextInt();
System.out.println("年龄为:" + age);
} catch (Exception e) {
System.err.println("请输入数字!");
e.printStackTrace();
}
}
}
三、多重catch
- —段代码可能会引发多种类型的异常
- 当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句
- 执行其中一条catch语句后,其后catch语句将被忽略
public class Demo03 {
public static void main(String[] args) {
try (Scanner sc = new Scanner(System.in)) {
System.out.print("请输入第一个数:");
int i = sc.nextInt();
System.out.print("请输入第二个数:");
int j = sc.nextInt();
int rs = i / j;
System.out.println("计算结果:" + rs);
System.out.println(args[0]);
} catch (ArithmeticException e) {
System.err.println("数学异常");
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e) {
System.err.println("数组下标越界");
e.printStackTrace();
}
}
}
还可以写成如下方式:
public class Demo03 {
public static void main(String[] args) {
try (Scanner sc = new Scanner(System.in)) {
System.out.print("请输入第一个数:");
int i = sc.nextInt();
System.out.print("请输入第二个数:");
int j = sc.nextInt();
int rs = i / j;
System.out.println("计算结果:" + rs);
System.out.println(args[0]);
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
}
四、throws
public class Test03 {
public static void main(String[] args) throws Exception {
Date date = dateFormat("2023-04-24");
System.out.println(date);
}
/**
* DateUtil工具
* @param str 日期字符串
* @return Date格式数据
* @throws Exception 异常提示
*/
public static Date dateFormat(String str) throws Exception {
String[] pattern = {"yyyy-MM-dd","yyyy/MM/dd","yyyy年MM月dd日"};
for (String s : pattern) {
try {
DateFormat sdf = new SimpleDateFormat(s);
return sdf.parse(str);
} catch (ParseException e) {
// e.printStackTrace();
}
}
throw new Exception("暂时不支持其他格式");
}
}
五、自定义异常
public class LoginException extends Exception{
public LoginException() {
super("账号或密码错误");
}
}
public class LockException extends Exception{
public LockException() {
super("账号锁定!");
}
}
public class Demo04 {
public static void main(String[] args) {
try {
login("zhangsan","123");
System.out.println("登录成功!");
} catch (LockException | LoginException e) {
e.printStackTrace();
}
}
public static void login(String account, String password) throws LockException, LoginException {
if ("zhangsan".equals(account)){
throw new LockException();
}
if (!("admin".equals(account) && "123".equals(password))){
throw new LoginException();
}
}
}
3、异常体系(分类)
异常的默认处理流程
二、Object
1、概述
- 在Java中,Object类是所有类的祖宗类。
- 没有extends语句的类声明含有extends Object。
- 示例:
- public class Employee {…}
等同于∶ - public class Employee extends Object {…}
- public class Employee {…}
- 两个重要的方法是︰
- equals
- toString
2、equals
==
运算符确定两个引用是否相同(即引用同一对象)。equals
方法确定对象逻辑上是否相等,但没必要相同。equals
方法的Object 实现使用==
运算符。- 用户类可以覆盖
equals
方法来实现特定域的相等测试。
3、toString
- 该方法将对象转换成 String。该方法用于字符串连接。
- 通过覆盖此方法以提供给用户更为易读的对象信息。
- 使用wrapper 类的toString静态方法来将基本类型转换为String。
4、finalize
- 当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize方法。如果在程序终止之前垃圾回收器始终没有执行垃圾回收操作,那么垃圾回收器将始终不会调用无用对象的finalize方法。
- finalize方法的特点︰
- 垃圾回收器是否会执行该方法及何时执行该方法,都是不确定的。
- finalize方法有可能使对象复活,使它恢复到可触及状态。
- 垃圾回收器在执行finalize方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行。
对finalize方法的最佳忠告就是,永远不要使用该方法。
5、clone
- clone 用于实现对象的克隆/拷贝。
- 要使用clone方法的对象,要实现Cloneable接口。