Java-18.异常

本文深入讲解了异常的基本概念,包括错误类型和处理方式,重点介绍了如何捕获并处理运行时异常、Error和自定义异常。通过实例演示了try-catch-finally结构,并探讨了如何使用`throws`关键字抛出异常。

一.异常的基本概念:

1.异常是错误,运行时异常。
2.抛异常,创建一个错误对象,把错误对象丢出来。
3.捕获异常,默认由JVM来把错误信息进行捕获,打印出来,JVM会终止程序的执行。

二.异常的分类:

RuntimeException:运行时异常,一般不手动处理。
其他Exception必须经过手动处理。
Error:一般指系统级错误。

三.异常的处理:

try…catch…

package obb;

public class test {
	public static void main(String[] args) {
		try {
			int a=1/0;
			System.out.println(a);
		}catch (Exception e){
			e.printStackTrace();	//可以看到哪里出错
			System.out.println("计算结果格式非法,重新输入");
		}finally {
			System.out.println("我是finally");
		}
	}
}

在这里插入图片描述

finally:无论最后是不是异常,finally都会输出。

package obb;

public class test {
	public static void chu(int a,int b) throws Exception{	//告诉外面我要仍一个异常
		if(b==0) {
			throw new Exception("0不能做除数");//真正向外抛出一个异常
		}else {
			System.out.println(a/b);
		}
	}
	public static void main(String[] args) throws Exception{
			chu(1,0);
	}
}

在这里插入图片描述

四.自定义异常:

throws Exception: 抛出异常,谁调用谁处理。

package obb;

public class Person {
	String name;
	String gender;
	public Person(String name, String gender) {
		super();
		this.name = name;
		this.gender = gender;
	}
}
package obb;

public class Zaotangzi {
	public void nan(Person p) throws genderException{
		if(p.gender=="男")
			System.out.println("欢迎光临");
		else {
			throw new genderException("性别不对,这里是男澡堂");
		}
	}
}

抛出异常。
在这里插入图片描述正常
在这里插入图片描述

[root@yfw lib]# ls -l jsr311-api-1.1.1.jar jersey-core-1.19.4.jar -rw-r--r-- 1 root root 436731 Nov 15 19:30 jersey-core-1.19.4.jar -rw-r--r-- 1 root root 46367 Nov 15 19:29 jsr311-api-1.1.1.jar [root@yfw lib]# ls -R /opt/openfire/plugins/restapi/ /opt/openfire/plugins/restapi/: changelog.html i18n lib logo_large.gif logo_small.gif plugin.xml readme.html web /opt/openfire/plugins/restapi/i18n: restapi_i18n_nl.properties restapi_i18n_pt_PT.properties restapi_i18n_uk_UA.properties restapi_i18n.properties restapi_i18n_ru_RU.properties restapi_i18n_zh_CN.properties /opt/openfire/plugins/restapi/lib: aopalliance-repackaged-2.6.1.jar jersey-common-2.45.jar classgraph-4.8.179.jar jersey-container-jetty-http-2.45.jar commons-lang3-3.17.0.jar jersey-container-jetty-servlet-2.45.jar hk2-api-2.6.1.jar jersey-container-servlet-2.45.jar hk2-locator-2.6.1.jar jersey-container-servlet-core-2.45.jar hk2-utils-2.6.1.jar jersey-entity-filtering-2.45.jar jackson-annotations-2.17.1.jar jersey-hk2-2.45.jar jackson-core-2.17.1.jar jersey-media-jaxb-2.45.jar jackson-databind-2.17.1.jar jersey-media-json-jackson-2.45.jar jackson-dataformat-yaml-2.18.2.jar jersey-server-2.45.jar jackson-datatype-jsr310-2.18.2.jar osgi-resource-locator-1.0.3.jar jackson-jaxrs-base-2.18.2.jar restAPI-1.12.0.jar jackson-jaxrs-json-provider-2.18.2.jar slf4j-api-2.0.9.jar jackson-module-jaxb-annotations-2.17.1.jar snakeyaml-2.3.jar jakarta.annotation-api-1.3.5.jar swagger-annotations-2.2.31.jar jakarta.inject-2.6.1.jar swagger-core-2.2.31.jar jakarta.validation-api-2.0.2.jar swagger-integration-2.2.31.jar jakarta.ws.rs-api-2.1.6.jar swagger-jaxrs2-2.2.31.jar jakarta.xml.bind-api-2.3.3.jar swagger-jaxrs2-servlet-initializer-v2-2.2.31.jar javassist-3.30.2-GA.jar swagger-models-2.2.31.jar jersey-client-2.45.jar /opt/openfire/plugins/restapi/web: docs images WEB-INF /opt/openfire/plugins/restapi/web/docs: favicon-16x16.png swagger-ui.css swagger-ui.js favicon-32x32.png swagger-ui.css.map swagger-ui.js.map index.html swagger-ui-es-bundle-core.js swagger-ui-standalone-preset.js oauth2-redirect.html swagger-ui-es-bundle-core.js.map swagger-ui-standalone-preset.js.map swagger-ui-bundle.js swagger-ui-es-bundle.js swagger-ui-bundle.js.map swagger-ui-es-bundle.js.map /opt/openfire/plugins/restapi/web/images: error-16x16.gif success-16x16.gif /opt/openfire/plugins/restapi/web/WEB-INF: web.xml [root@yfw lib]#
11-16
非常棒!你已经完成了绝大部分关键步骤,现在我们来 **精准定位并解决最后的兼容性问题**。 --- ## ✅ 当前状态分析 | 项目 | 状态 | |------|------| | `jsr311-api-1.1.1.jar` 和 `jersey-core-1.19.4.jar` 是否存在? | ✅ 存在(但属于 Jersey 1.x) | | REST API 插件目录结构是否完整? | ✅ 完整 | | 插件 `/lib/` 中使用的是什么版本? | 🔴 **Jersey 2.45**(JAX-RS 2.x) | | 主 `lib/` 中添加了 Jersey 1.19.4? | ⚠️ ❌ 版本冲突! | --- ## 🚨 核心问题:**JAX-RS 版本严重不匹配** ### 🔍 深层原因: 你在主 `lib/` 目录手动加入了: ```bash jsr311-api-1.1.1.jar → JAX-RS 1.1 jersey-core-1.19.4.jar → Jersey 1.x 实现 ``` 但 Openfire 的 `restapi` 插件实际使用的是: ```bash jakarta.ws.rs-api-2.1.6.jar → JAX-RS 2.1(Jakarta EE) jersey-server-2.45.jar → Jersey 2.45 实现 ``` 👉 这是 **两个完全不同的 JAX-RS 版本体系**! ### ❌ 后果: - JVM 加载类时会优先找到旧版 `javax.ws.rs.*` 接口 - 但插件期望的是新版 `jakarta.ws.rs.*` - 导致 SPI 机制失败,无法初始化 `RuntimeDelegate` - 抛出 `ClassNotFoundException: com.sun.ws.rs.ext.RuntimeDelegateImpl` --- ## ✅ 正确解决方案:移除冲突依赖,启用 Jakarta EE 支持 ### 🔧 步骤 1:删除错误的手动添加的 JAR 包 ```bash cd /opt/openfire/lib sudo rm -f jsr311-api-1.1.1.jar jersey-core-1.19.4.jar ``` > ⚠️ 不要混合使用 Jersey 1.x 和 2.x,否则会导致类加载混乱。 --- ### 🔧 步骤 2:确认插件使用的 Jersey 2.x 能被正确加载 你的插件路径 `/opt/openfire/plugins/restapi/lib/` 已包含完整的 Jersey 2.45 套件,包括: - `jersey-server-2.45.jar` - `jakarta.ws.rs-api-2.1.6.jar` - `jersey-container-servlet-2.45.jar` 这些才是正确的依赖。 --- ### 🔧 步骤 3:更新 systemd 配置以支持 Jakarta + Java 17 编辑服务文件: ```bash sudo nano /etc/systemd/system/openfire.service ``` #### ✅ 使用以下 `ExecStart` 配置: ```ini ExecStart=/usr/lib/jvm/java-17-openjdk/bin/java \ -DopenfireHome=/opt/openfire \ -Dopenfire.lib.dir=/opt/openfire/lib \ --add-modules=java.se \ --add-opens=java.base/java.lang=ALL-UNNAMED \ --add-opens=java.base/java.nio=ALL-UNNAMED \ --add-opens=java.base/java.util=ALL-UNNAMED \ --add-opens=java.base/java.util.concurrent=ALL-UNNAMED \ --add-opens=java.base/java.time=ALL-UNNAMED \ -Xms256m \ -Xmx1g \ -cp "/opt/openfire/lib/*:/opt/openfire/plugins/restapi/lib/*" \ org.jivesoftware.openfire.starter.ServerStarter ``` 📌 关键点说明: - `-cp "...plugins/restapi/lib/*"`:显式将 REST 插件的依赖加入 classpath - `--add-opens=java.time`:Jakarta JSON 处理可能需要访问时间类 - 移除了冲突的旧版 Jersey --- ### 🔧 步骤 4:重载并重启服务 ```bash sudo systemctl daemon-reload sudo systemctl restart openfire ``` --- ### 🔧 步骤 5:查看日志验证是否成功加载 REST API ```bash sudo journalctl -u openfire.service -f --since "1 minute ago" ``` ✅ 成功标志: ```log INFO: Scanning for root resource and provider classes in the packages: org.jivesoftware.openfire.plugin Registered Jersey handler for plugin 'restapi' at /plugins/restapi/rest/* Successfully loaded plugin 'restapi' ``` 如果仍报错,请检查是否有如下异常: ```log java.lang.NoClassDefFoundError: jakarta/servlet/ServletConfig ``` 若有,则需确保 Jetty Servlet API 在类路径中(你已有 `jetty-servlet-api-4.0.6.jar` → ✅) --- ## ✅ 可选:测试 REST API 是否可用 ### 获取管理员 Token(首次使用需先完成 Web 安装向导) 1. 登录管理界面:http://your-server:9090 2. 完成初始设置(数据库、管理员账号等) 3. 进入 **“系统管理” → “REST API”** 4. 启用 REST API 并生成 Secret Key(Token) ### 测试命令(替换 token): ```bash curl -X GET \ http://localhost:9090/plugins/restapi/v1/users \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -H "Accept: application/json" ``` 预期返回所有用户列表(JSON 格式)。 --- ## ✅ 总结:最终修复流程 | 步骤 | 操作 | |------|------| | 1 | 删除冲突的 `jsr311-api-1.1.1.jar` 和 `jersey-core-1.19.4.jar` | | 2 | 确保 `/opt/openfire/plugins/restapi/lib/` 包含 Jersey 2.45 和 Jakarta JAR | | 3 | 修改 `systemd` 配置,把插件 lib 加入 `-cp` 并开放模块权限 | | 4 | 重启服务,观察日志是否成功加载 REST API | | 5 | 访问 Web 控制台完成初始化配置 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值