java_note_Exception

本文深入探讨了Java中异常处理的概念、机制、分类、捕获与处理方式,包括数学算法异常、数组越界异常及自定义异常的实现。通过具体代码示例展示了如何使用try、catch和finally块来捕获和处理异常,以及如何使用throws关键字抛出异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA异常

运行期出现的错误,而不是编译时出现的错误。
观察错误的名字和行号很重要。

eg.C 和C++ 在语法的级别上都不检查数组的越界。

数组越界异常:
java.lang.ArrayIndexOutofBoundsException

异常的概念:
1.JAVA异常是用于处理程序中错误的一种机制。
2.所谓错误是指在程序运行中发生的一些异常事件。
3.设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或者产生不可预见的结果。
4.JAVA的执行过程中如果出现异常事件,可以生成一个异常类对象,该对象封装了异常事件的信息并且将被提高给JAVA运行时系统,这个过程就是 抛出(throw)异常.
5.当java运行时系统接受到异常对象时,会寻找能处理这个异常的代码并把当前异常对象交给其处理,这个过程称为 捕获(catch)异常。

数学算法异常:
java.lang.ArithmeticException

语法规则:
eg:
...
try{
System.out.println(2/0);
}
// e是ArithmeticException的一个实例,其初始化是当出现异常时系统自动初始化。
catch(ArithmeticException e){
System.out.println("系统出现错误,请与管理员联系!");
e.printStackTrace();
}
..

例:
//throws关键字表示抛出异常
public int read() throws IOException


异常的分类:
Throwable为所有异常类的根类,位于 java.lang
Error 和 Exception 继承自跟类
Error是系统的错误,JVM出错,无法管理;
Exception表示可以处理的错误。
RuntimeException 继承自Exception.
RuntimeException表示经常出的,可以不用catch。
例如被0除,数组下标超出范围等
其他继承自Exception的异常表示必须要catch的异常:
如jdk中跟在类名之后表示抛出的异常

eg:
//
void m(int i) throws ArithmeticException{
if(i == 0){
throw new ArithmeticException("被除数为0");
}
}

异常的捕获和处理
1.try代码段包含可能产生 例外的代码。
2.try代码段后跟有一个或者多个catch代码段。
3.每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法。
4.当异常发生时,程序会中止当前的流程,根据获取异常的类型的类型去执行相应的catch代码段。
5.finally段的代码无论是否发生异常都有执行;通常finally语句中可能进行资源的清除工作,
如:关闭打开的文件;删除临时文件;……

eg:
...
FileInputStream in = null;
try{
in = new FileInputStream("myfile.txt");
int b ;
b = in.read();
while(b != -1){
System.out.print((char) b);
b = in.read();
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
System.out.print(e.getMessage());
} finally{
try{
in.close();
}catch(IOException e){
e.printStackTrace();
}
}
...

Java的例外处理机制:关键字throws
Java的例外处理机制使得例外事件,沿着被调用的顺序往前寻找,只要找到能够处理的方法为止。
任何方法都可以 throws Exception;包括public static void main()...
碰到exception尽量要处理,要有一个良好的编程习惯;
不能够处理的要抛出异常。
eg:
void f() throws FileNotFoundException IOException{
FileInputStream in = new FileInputStream("myfile.txt");
int b ;
b = in.read();
while(b != -1){
System.out.print((char)b);
b = in.read();
}
}

在一个异常中,一个异常的基类异常位于前面,则此异常不可能被捕获到,则编译时会出错。


使用自定义的异常
1.通过继承java.lang.Exception类声明自己的异常类。
2.在方法适当的位置生成自定义异常的实例,并用throw语句抛出。
3.在方法的声明部分用throws语句声明该方法可能抛出的异常。

eg:
class MyException extends Exception{
private int id;
public MyException(String message, int id){
super(message);
this.id = id;
}
public int getId(){
return id;
}
}
public class Test{
public void regist(int num) throws MyException{
if(num<0){
throw new MyException("the persons' number is nagetive,inpossible", 3);
}
System.out.println("regist persons:" + num);
}

public void manager(){
try{
regist(100);
}catch(MyException e){
System.out.println("regist error,the ID:" + e.getid());
e.printStackTrace();
}
System.out.print("operation is over!");
}

public static void main(String[] args){
Test t = new Test();
t.manager();
}
}

注意:
重写方法需要抛出与原方法所抛出异常类型一致的异常或者不抛出异常。
<think>好的,用户的问题是关于解决JDK_JAVA_OPTIONS配置导致的服务器断开问题,特别是与add-opens相关。首先,我需要理解JDK_JAVA_OPTIONS的作用。这个环境变量用于设置Java虚拟机的全局选项,会在所有Java应用程序启动时生效。而add-opens是用来开放某些模块的包,以便在运行时进行深度反射访问,这在模块化系统中是必要的。用户提到服务器断开连接,可能的原因有几个。首先,检查是否有语法错误。例如,add-opens的格式是否正确,应该是模块/包=目标模块。比如,正确的写法是--add-opens java.base/java.lang=ALL-UNNAMED。如果格式错误,比如缺少等号或模块名拼写错误,JVM可能无法启动,导致服务器立即退出。 其次,版本兼容性问题。add-opens选项在Java9及更高版本中引入,如果用户使用的是旧版JDK(比如8或更早),这个选项不被支持,启动时会报错,导致连接断开。需要确认JDK版本是否匹配。 另外,权限问题也可能导致问题。某些安全管理器或容器环境可能限制JVM参数的设置,导致配置无法生效。需要检查是否有安全策略阻止了该参数的设置。 接下来,解决方案的步骤。第一步是检查JVM参数格式是否正确,确保每个选项都以--开头,并且模块和包名正确。例如,正确的写法是:JDK_JAVA_OPTIONS="--add-opens java.base/java.lang=ALL-UNNAMED"。如果用户配置中缺少--,或者模块路径错误,需要修正。第二步是验证JDK版本,使用java-version命令确认版本是否为9以上。如果是旧版本,可能需要升级JDK或改用其他兼容的反射配置方法,比如使用--add-exports或其他方式。 第三步是查看日志,通过服务器的启动日志或控制台输出,找到具体的错误信息。日志中可能会指出参数错误或模块不存在等问题,帮助快速定位。第四步是分步测试,先移除所有JDK_JAVA_OPTIONS配置,确认服务器是否能正常启动。然后逐步添加参数,每次添加一个,观察哪个参数导致问题,从而隔离问题。此外,还需要考虑是否有其他冲突的JVM参数。例如,同时设置了多个add-opens或与其他选项冲突,导致不可预见的错误。需要逐一排查。最后,用户可能需要替代方案,比如在启动命令中直接使用JAVA_TOOL_OPTIONS,或者在应用的启动脚本中明确添加参数,避免使用全局的JDK_JAVA_OPTIONS,减少影响范围。在生成相关问题的时候,需要涵盖常见的配置错误、版本问题、日志分析以及替代方法,帮助用户全面理解可能的问题点和解决方案。</think>### 解决`JDK_JAVA_OPTIONS`配置`add-opens`导致服务器断开的问题 #### 1. 问题分析 当使用`JDK_JAVA_OPTIONS`配置`--add-opens`时,若格式错误或模块名不匹配,可能导致JVM无法启动,从而触发服务器断开。例如: - 语法错误:缺少`=`或模块名拼写错误(如`java.base`写成`java.bases`) - 版本不兼容:`--add-opens`仅在Java 9+支持,旧版JDK会直接报错[^1] - 权限限制:某些容器环境可能禁止全局JVM参数设置 #### 2. 解决方案 **步骤1:检查参数格式** 确保参数符合以下规范: ```bash # 正确示例(注意等号两侧无空格) JDK_JAVA_OPTIONS="--add-opens java.base/java.lang=ALL-UNNAMED" ``` 错误示例:`--add-opens java.base/java.lang ALL-UNNAMED`(缺少`=`) **步骤2:验证JDK版本** 通过命令确认版本: ```bash java -version # 输出需包含"Java 9"或更高版本 ``` **步骤3:查看日志定位错误** 在服务器日志中搜索以下关键字: ``` Unrecognized option: --add-opens module not found: java.bases ``` **步骤4:分步测试配置** ```bash # 先清空所有参数测试 unset JDK_JAVA_OPTIONS ./start_server.sh # 逐步添加参数 export JDK_JAVA_OPTIONS="--add-opens java.base/java.lang=ALL-UNNAMED" ./start_server.sh ``` #### 3. 替代方案 若问题仍存在,可改用以下方式: - **启动脚本直接传递参数**: ```bash java --add-opens java.base/java.lang=ALL-UNNAMED -jar app.jar ``` - **使用`JAVA_TOOL_OPTIONS`替代**(部分环境兼容性更好): ```bash export JAVA_TOOL_OPTIONS="--add-opens java.base/java.lang=ALL-UNNAMED" ``` #### 4. 典型错误示例 ```log Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. Unrecognized VM option 'add-opens' ``` 此错误表明:①参数缺少`--`前缀;②JDK版本低于Java 9[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值