//父类方法没有抛出异常,则子类重写时不能抛出异常,只能捕获异常
/*
异常的体系:
----------| Throwable 所以异常或者错误类的超类
--------------|Error 错误 错误一般是用于jvm或者是硬件引发的问题,所以我们一般不会通过代码去处理错误的。
--------------|Exception 异常 是需要通过代码去处理的。
如何区分错误与异常呢:
如果程序出现了不正常的信息,如果不正常的信息的类名是以Error结尾的,那么肯定是一个错误( ThreadDeath 也是错误)。
如果是以Exception结尾的,那么肯定就是一个异常。
java虚拟机在默认的情况下只能管理64m内存。
byte[] buf = new byte[102410241024];//1G
- /
/
一个try块可以捕获多种异常的类型,但是捕获的异常类型必须从小到大进行捕获,否则编译报错。
finally块的 使用前提是必须要存在try块才能使用。
finally非常适合做资源释放的工作,这样子可以保证资源文件在任何情况下都 会被释放。
/
/
try块的三种组合方式:
第一种: 比较适用于有异常要处理,但是没有资源要释放的。
try{
可能发生异常的代码
}catch(捕获的异常类型 变量名){
处理异常的代码
}
第二种:比较适用于既有异常要处理又要释放资源的代码。
try{
可能发生异常的代码
}catch(捕获的异常类型 变量名){
处理异常的代码
}finally{
释放资源的代码;
}
第三种: 比较适用于内部抛出的是运行时异常,并且有资源要被释放。
try{
可能发生异常的代码
}finally{
释放资源的代码;
}
*/
package demo.oo;
//自定义异常类
class CustomException extends Exception {
CustomException(String message) {
super(message);
}
}
class ExceptionTest {
private static void test2() {
test();
}
private static void test() {
//打印异常的栈信息
new Throwable().printStackTrace();
System.out.println("这一行的问题导致以下调用行出现问题,层层查询");
}
public static void main(String[] args) {
// Throwable throwable1 = new Throwable();
//toString()返回当前异常对象的完整类名(包名+类名)+ 病态信息
// System.out.println(new Throwable("头晕").toString());
//getMessage()返回的是创建Throwable传入的字符串信息。
// System.out.println(new Throwable("感冒").getMessage());
//test2(); //打印异常的栈信息
//catchException(); //捕捉异常
try {
throwException(); //抛出异常
//String other = null;
//throwCustomException(other); //抛出自定义异常
} catch (CustomException e) {
e.printStackTrace();
System.out.println("自定义异常的修正方法:插入网线");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("除非退出jvm,否则finally块一定执行");
//System.exit(0);// 退出java虚拟机
}
System.out.println("对异常捕捉处理后,下面程序正常执行。但是方法内throw后面的代码不执行");
if (true) {
//throw new ArithmeticException(); //运行时异常无需声明
//throw new Exception(); //编译时异常,必须声明(throws Exception)
}
}
//抛出自定义异常
private static void throwCustomException(String ip) throws CustomException {
if (ip == null) {
throw new CustomException("自定义异常抛出:没有插网线");
}
System.out.println("不执行");
}
//抛出异常
private static void throwException() throws Exception/*, NullPointerException...*/ {
if (true) {
throw new Exception();//抛出一个异常对象...
}
System.out.println("不执行");
}
//捕捉异常
private static void catchException() {
int a = 2, b = 0, c;
try {
c = a / b; //jvm在这句话的时候发现有不正常的情况,那么就会创建一个对应的异常对象。
System.out.println("不执行");
} catch (ArithmeticException e) {
//处理异常的代码....
System.out.println("异常处理了....");
System.out.println("toString: " + e.toString());
} catch (NullPointerException e) {
System.out.println("出现了空指针异常....");
} catch (Exception e) {
System.out.println("我是急诊室,包治百病!");
}
System.out.println("处理后继续执行后面代码");
}
}
这篇博客详细介绍了Java异常处理的原理和实践,包括异常的体系结构、如何区分错误与异常、try-catch-finally的使用方式,以及自定义异常的创建和抛出。同时,文章还通过实例演示了异常的捕获和资源释放,强调了finally块在确保资源清理方面的重要性。

被折叠的 条评论
为什么被折叠?



