[] 什么是try-catch-finally块?
在Java中,try-catch-finally块是异常处理的核心结构,用于捕获和处理程序运行时可能出现的异常。这个结构由三个部分组成:
1. try块:包含可能会抛出异常的代码。如果try块中的代码执行过程中没有发生任何异常,那么紧随其后的catch块将被忽略。
try {
// 可能会抛出异常的代码
}
2. catch块:紧随try块之后,用于捕获和处理try块中抛出的异常。可以有多个catch块,每个catch块处理不同类型的异常。
catch (ExceptionType1 e1) {
// 处理ExceptionType1类型的异常
}
catch (ExceptionType2 e2) {
// 处理ExceptionType2类型的异常
}
// 可以有更多catch块
注意:catch块中的参数通常是异常实例的引用,通常命名为e(代表exception,异常)。
3. finally块:无论是否发生异常,以及是否捕获了异常,finally块中的代码都会执行。这使得finally块成为执行资源清理操作(如关闭文件流或数据库连接)的理想位置。
finally {
// 无论是否发生异常,这些代码都会执行
}
一个完整的try-catch-finally示例可能如下所示:
try {
// 尝试执行的代码,可能会抛出异常
FileReader reader = new FileReader("file.txt");
// ...
} catch (FileNotFoundException e) {
// 如果文件未找到,处理这个异常
System.err.println("文件未找到: " + e.getMessage());
} finally {
// 无论是否发生异常,都会执行的代码
// 例如,关闭打开的资源
}
在上述示例中,如果FileReader构造函数抛出FileNotFoundException,那么这个异常将被相应的catch块捕获并处理。无论是否抛出异常,finally块中的代码都会执行,这通常用于确保资源被正确关闭,即使在发生异常的情况下。
需要注意的是,如果try块中的代码正常结束,那么紧随其后的catch块将被跳过。如果try块中的代码因为异常而退出,那么匹配异常类型的catch块将被执行。如果所有catch块都不能匹配抛出的异常类型,那么异常将向上抛到调用栈的上一层,直到被捕获或者程序终止。
[] 什么是Java的访问修饰符?
在Java中,访问修饰符用于定义类、方法、构造器和变量的访问级别。它们控制其他类对这些成员的访问权限。Java支持四种访问修饰符:
1. public:
- public是最具包容性的访问修饰符。声明为public的类或成员可以被任何其他类访问,不受限制。
2. protected:
- protected访问级别比public稍微受限。声明为protected的成员可以被同一个包内的其他类以及不同包中继承了该类的子类访问。
3. 默认(无修饰符):
- 如果没有指定访问修饰符(也就是什么也不写),那么成员具有默认访问级别,通常称为“包访问级别”。
- 默认访问级别的成员只能被同一个包内的其他类访问,不同包的类无法访问。
4. private:
- private是访问限制最严格的修饰符。声明为private的成员只能被其所在的类访问,即使是同一个包内的其他类或继承了该类的子类也无法访问。
以下是每种访问修饰符的典型使用场景:
- public:当你希望成员被广泛访问时使用,例如,当创建一个API或库时。
- protected:当你希望子类能够访问父类的某些成员,但又不希望这些成员对同一个包内的非子类公开时使用。
- 默认:当你希望限制访问仅限于同一个包内时使用。
- private:当你希望隐藏类的内部实现细节,只允许通过类的公共接口与类的对象交互时使用。
访问修饰符是封装原则的关键部分,它们允许开发者隐藏内部实现,只暴露必要的操作和属性,从而提高代码的安全性和易于维护。