一 背景
一直以为Java静态块抛异常,没人捕获,虚拟机会推出,要不是最近debug到异常的执行流程,观念还正不了,自己看吧。
二 代码
(1)静态块抛异常类
/** * 静态块抛异常类 */ public class App { static { System.out.println("static start !============="); if (true) { throw new RuntimeException("static test"); } System.out.println("static finiah!============="); } public static void hello() { System.out.println("hello ! "); } }
(2)调用类
/** * 调用静态块 */ public class TestApp { public static void main(String[] args) { try { App.hello(); } catch (Throwable e) { System.err.println("excepiton1 start : =========" ); e.printStackTrace(); System.err.println("excepiton1 finish! ========="); } System.err.println("--------------------------------"); try { App.hello(); } catch (Throwable e) { System.err.println("excepiton2 start ! ========="); e.printStackTrace(); System.err.println("excepiton2 finish! ========="); } } }
三 执行结果
static start !============= excepiton1 start : ========= java.lang.ExceptionInInitializerError at x.test.TestApp.main(TestApp.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Caused by: java.lang.RuntimeException: static test at x.test.App.<clinit>(App.java:11) ... 6 more excepiton1 finish! ========= -------------------------------- excepiton2 start ! ========= java.lang.NoClassDefFoundError: Could not initialize class x.test.App at x.test.TestApp.main(TestApp.java:18) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) excepiton2 finish! =========
四 说明
1)静态块在类首次使用时加载类后调用,如果调用过程产生异常,会抛到首次调用处,可以捕获。
2)后续调用该类,会出现找不到类异常
相关推荐
- **定义**:当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常。 - **示例**:实例化抽象类或接口。 ##### 10. **内部错误**:`InternalError` - **定义**:用于指示Java虚拟机发生了内部...
- finally块总是在try-catch之后执行,即使发生了异常也会执行finally块中的代码。 **8.6 异常调用栈** - 当异常发生时,会生成一个异常调用栈,显示异常发生的上下文。 **8.7 异常层次** - Throwable类是所有...
掌握异常处理机制是Java编程的基本要求,此外还包括throw关键字的使用,它用于程序中主动抛出异常;以及自定义异常的创建,即根据实际需要定义自己的异常类型。通过学习异常体系结构,可以更好地理解和处理Java中...
在异常处理方面,Java提供了try、catch、finally关键字来捕获和处理异常,throw用于抛出异常,throws用于声明方法可能抛出的异常。异常分为运行时异常和一般异常,运行时异常一般发生在程序运行时,一般异常则需要...
注意:同名之类被创建之后,其同名静态块不会再次执行。 总结 1. 不同名子类之间的静态块不会相互调用,也没有任何联系。 2. 不同名子类在创建对象之前,如果父类的静态块没有被调用过,那么就先调用父类静态块,...
JVM 在运行时有多个数据区域,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区(在 Java 8 及以后版本中被元空间取代)。每个区域都有特定的功能,例如,堆是对象实例的存储地,而虚拟机栈则是方法调用的上下文。...
try块包含可能抛出异常的代码,catch块用于处理try块中抛出的异常,finally块则无论是否发生异常都会执行,常用于资源清理等操作。 #### 编程规范 遵循良好的编程规范对于编写可读、可维护的代码至关重要。Java...
- Java 8 以后的版本中,接口可以包含默认方法和静态方法。 - 类可以通过实现接口来支持这些行为规范。 - 接口的主要目的是定义行为标准,使得不同类之间可以通过实现相同的接口来进行交互。 ### 四、...
Java 8 之后引入了默认方法和静态方法,但主要还是用于定义行为规范。一个类可以实现多个接口。 #### 8. Java 中的泛型是什么? **答案解析:** 泛型是 Java 5 引入的一项重要特性,它允许在编译时指定类型参数,...
Java 8之后,接口也可以包含默认方法和静态方法的实现。 18. 什么是类的反射机制? 反射机制是指在运行时动态获取类的信息和调用类的方法或访问类的属性的能力。 19. 类的反射机制中的包及核心类? 在Java中,核心类...
异常处理通过try-catch-finally语句块进行,try块中的代码可能抛出异常,catch块捕获并处理异常,finally块中的代码无论是否发生异常都会执行。使用throws关键字声明方法可能抛出的异常,表明异常的责任由调用者处理...
Java API文档是学习Java的重要参考资料,它详细列出了每个类、接口、方法和构造函数的用途、参数、返回值和可能抛出的异常。英文版API可以帮助开发者了解原始的设计意图,理解更准确,对于查阅官方更新和修正也更为...
### Java虚拟机(JVM)介绍 #### 一、Java虚拟机的...理解这些内存区域和异常处理机制对于有效地管理和优化Java应用程序至关重要。通过对JVM内存管理机制的深入了解,开发者可以更好地诊断和解决运行时出现的各种问题。
3. 静态类:Java不支持直接定义静态类,但可以通过静态内部类来实现类似的功能。 **Singleton模式:** Singleton模式确保一个类只有一个实例,并提供一个全局访问点。 **final关键字:** 1. final变量:一旦被...
在Java中,异常处理是一种用于处理程序运行时错误的机制,通过抛出和捕获异常对象来响应异常情况。自定义异常通常继承自`Exception`类,允许开发者定义特定于应用程序的错误类型,增强代码的可读性和维护性。 ### ...
`finally`语句块则会在`try`和`catch`之后无论是否有异常发生都会执行。 **例题解析:** - 给定的代码示例中,`return`语句位于`try`块中,但由于`finally`块的存在,即使执行了`return`,`finally`块中的代码也会...
- 如果在try块中抛出了异常,那么catch块中的代码将会被执行,之后会执行finally块中的代码。 7. Java中的对象类型转换: - 在Java中,可以将子类对象赋值给父类类型的变量(向上转型),但将父类对象赋值给子类...
- Java中使用try、catch、finally处理异常,其中try语句块用于包裹可能抛出异常的代码,catch用于捕获和处理异常,finally通常用于清理资源。 7. 多线程和同步: - Java中有多种方法实现线程,包括继承Thread类或...
1. **`try`:** 用于标识可能抛出异常的代码块。 2. **`catch`:** 用于捕获特定类型的异常并处理。 3. **`throw`:** 用于显式抛出一个异常。 4. **`throws`:** 用于声明方法可能会抛出的异常类型。 5. **`finally...
"try"块用于包裹可能出现异常的代码,"catch"块用于捕获并处理特定类型的异常,"finally"块内的代码总是会在try块之后执行,无论是否发生异常。"throw"用于手动抛出异常,而"throws"用于方法签名中声明该方法可能抛...