异常
这是Java 异常类层次结构图概览:
Exception 和 Error 有什么区别?
一、概念与本质
Exception(异常):异常是在程序运行过程中出现的可预料的、可恢复的不正常情况。例如,试图打开一个不存在的文件时,会抛出FileNotFoundException
,这是一种异常。异常通常表示程序运行时的意外情况,但这些情况是可以通过合理的错误处理机制来处理的,使程序能够从异常中恢复并继续执行。
Error(错误) : 错误是指在程序运行过程中发生的严重问题,通常是不可恢复的。例如,OutOfMemoryError
表示内存耗尽,这种情况下程序通常无法继续正常运行。错误往往是由于系统资源耗尽、虚拟机内部错误等严重问题导致的。
二、处理方式
Exception(异常):
异常可以被捕获(try - catch 语句块)和处理。例如:
try {
FileInputStream fis = new FileInputStream("nonexistent.txt");
} catch (FileNotFoundException e) {
// 处理文件不存在的情况,比如提示用户重新输入文件名
System.out.println("文件不存在,请检查文件名");
}
有些异常必须在方法签名中声明(受检异常,Checked Exception),如IOException
,这样调用该方法的代码就知道需要处理这种异常。
Error(错误):
Error
属于程序无法处理的错误,因为 Error 通常表示严重的系统问题,即使捕获了也很难从这种错误中恢复程序的正常运行。例如,捕获OutOfMemoryError
并不能真正解决内存不足的问题,因为此时系统已经处于一种资源极度匮乏的状态。
面向对象的三大特性
封装
隐藏对象的属性和细节实现,仅对外公开访问方法,控制程序中的读和写的访问级别。
封装的示例代码:
public class Student {
private int id;//id属性私有化
private String name;//name属性私有化
//获取id的方法
public int getId() {
return id;
}
//设置id的方法
public void setId(int id) {
this.id = id;
}
//获取name的方法
public String getName() {
return name;
}
//设置name的方法
public void setName(String name) {
this.name = name;
}
}
继承
继承是面向对象编程中的一个重要概念,它是一种创建新类(称为子类或派生类)的方式,新类从现有的类(称为父类或基类)获取属性(成员变量)和方法。子类继承父类的状态(属性)和行为(方法),使得子类可以重用父类的代码。
关于继承如下 3 点请记住:
- 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
继承的示例代码:
//继承
class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating.");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void bark() {
System.out.println("The dog is barking.");
}
}
//重写
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println(super.getName() + " is eating dog food.");
}
public void bark() {
System.out.println("The dog is barking.");
}
}
多态
多态表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。
多态的特点:
- 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
- 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
- 多态不能调用“只在子类存在但在父类不存在”的方法;
- 如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法
try-catch-finally如何使用?
try
块:用于捕获异常。其后可接零个或多个catch
块,如果没有catch
块,则必须跟一个finally
块。catch
块:用于处理 try 捕获到的异常finally
块:无论是否捕获或处理异常,finally
块里的语句都会被执行。当在try
块或catch
块中遇到return
语句时,finally
语句块将在方法返回之前被执行。
代码示例:
try {
System.out.println("Try to do something");
throw new RuntimeException("RuntimeException");
} catch (Exception e) {
System.out.println("Catch Exception -> " + e.getMessage());
} finally {
System.out.println("Finally");
}
输出结果:
Try to do something
Catch Exception -> RuntimeException
Finally
注意:不要在 finally 语句块中使用 return! 当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。