java编译时抛出异常 java.lang.RuntimeException: Stub!

本文探讨了在Android项目中直接运行Java代码并导入Android包导致的java.lang.RuntimeException:Stub!异常问题。通过将Logger.d()更改为System.out.print()成功解决了这一问题。同时分享了一个简单的Netty客户端示例,用于处理字符串消息。

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

java编译时抛出异常 java.lang.RuntimeException: Stub!

一般是Android项目 直接运行java代码导入了Android的包导致.

 

Logger.d()更改为System.out.print()就没问题了
**
 * 当编解码器为字符串时用来接收数据
 *
 * @author ${LI}
 * @date 2019.04.09
 */
public class ClientStringHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
//        ctx.flush();
        System.out.print("client:" + msg.toString() + "\n\r");
        if (msg.toString().equals("123")) {
            ctx.close();
        }

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        System.out.print("exceptionCaught------" + cause.getMessage());
//        ctx.close();
    }

    public static void main(String[] args) {
//        String host = "192.168.3.169";
        String host = "127.0.0.1";
        int port = 12038;
        Channel channel = new ImConnection().connect(host, port);
        channel.writeAndFlush("111111111111");
        channel.writeAndFlush("你好");
    }
}

只是简单记录 一下,如有不对请谅解!

机器分析结论: 应用名:健康 应用版本号:4.20.34_b780cda_250217 安装路径:null安装 应用进程名:com.heytap.health:SportDaemonService 问题类型:JavaCrash 问题原因:java.lang.NoClassDefFoundError错误 结果匹配:相关 关键日志: Line 5304: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: java.lang.NoClassDefFoundError: sf.b Line 5312: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: Caused by: java.lang.ExceptionInInitializerError Line 5323: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: Caused by: java.lang.RuntimeException: stub 堆栈信息: Line 5302: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: FATAL EXCEPTION: ES@DP_SyncCloud Line 5303: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: Process: com.heytap.health:SportDaemonService, PID: 22556 Line 5304: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: java.lang.NoClassDefFoundError: sf.b Line 5305: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at com.health.database.depend.d.N(SourceFile:1) Line 5306: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at pb.c.a(SourceFile:54) Line 5307: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at androidx.appcompat.widget.c.run(SourceFile:120) Line 5308: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at kg.a.run(SourceFile:6) Line 5309: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) Line 5310: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) Line 5311: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at java.lang.Thread.run(Thread.java:1012) Line 5312: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: Caused by: java.lang.ExceptionInInitializerError Line 5313: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at qd.a.initAfterPrivacyAgreed(SourceFile:12) Line 5314: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at pd.g.b(Unknown Source:2) Line 5315: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at pd.c.b(SourceFile:5) Line 5316: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at androidx.camera.core.p.run(SourceFile:91) Line 5317: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at kg.a.run(SourceFile:6) Line 5318: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at com.heytap.health.base.task.ThreadUtils$b.run(SourceFile:6) Line 5319: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:487) Line 5320: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:264) Line 5321: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307) Line 5322: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: ... 3 more Line 5323: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: Caused by: java.lang.RuntimeException: stub Line 5324: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at com.oplus.osense.OsenseResEventClient.getInstance(Unknown Source:4) Line 5325: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: at sf.b.<clinit>(SourceFile:5) Line 5326: 03-24 15:40:12.838 22556 23127 E AndroidRuntime: ... 12 more
03-28
FATAL EXCEPTION: main Process: com.trassion.audiopath, PID: 10264 java.lang.RuntimeException: Unable to start service com.trassion.audiopath.rpc.RpcService@e57ff2e with Intent { cmp=com.trassion.audiopath/.rpc.RpcService }: java.lang.SecurityException: Starting FGS with type connectedDevice callerApp=ProcessRecord{7de7bc1 10264:com.trassion.audiopath/u0a320} targetSDK=34 requires permissions: all of the permissions allOf=true [android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE] any of the permissions allOf=false [android.permission.BLUETOOTH_ADVERTISE, android.permission.BLUETOOTH_CONNECT, android.permission.BLUETOOTH_SCAN, android.permission.CHANGE_NETWORK_STATE, android.permission.CHANGE_WIFI_STATE, android.permission.CHANGE_WIFI_MULTICAST_STATE, android.permission.NFC, android.permission.TRANSMIT_IR, android.permission.UWB_RANGING, USB Device, USB Accessory] at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:5452) at android.app.ActivityThread.-$$Nest$mhandleServiceArgs(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2613) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loopOnce(Looper.java:311) at android.os.Looper.loop(Looper.java:408) at android.app.ActivityThread.main(ActivityThread.java:9151) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:692) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945) Caused by: java.lang.SecurityException: Starting FGS with type connectedDevice callerApp=ProcessRecord{7de7bc1 10264:com.trassion.audiopath/u0a320} targetSDK=34 requires permissions: all of the permissions allOf=true [android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE] any of the permissions allOf=false [android.permission.BLUETOOTH_ADVERTISE, android.permission.BLUETOOTH_CONNECT, android.permission.BLUETOOTH_SCAN, android.permission.CHANGE_NETWORK_STATE, android.permission.CHANGE_WIFI_STATE, android.permission.CHANGE_WIFI_MULTICAST_STATE, android.permission.NFC, android.permission.TRANSMIT_IR, android.permission.UWB_RANGING, USB Device, USB Accessory] at android.os.Parcel.createExceptionOrNull(Parcel.java:3242) at android.os.Parcel.createException(Parcel.java:3226) at android.os.Parcel.readException(Parcel.java:3209) at android.os.Parcel.readException(Parcel.java:3151) at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:7547) at android.app.Service.startForeground(Service.java:776) at com.trassion.audiopath.rpc.RpcService.onStartCommand(RpcService.kt:59) at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:5434) ... 9 more Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.am.ActiveServices.validateForegroundServiceType(ActiveServices.java:3078) at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:2756) at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:2000) at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:15512) at android.app.IActivityManager$Stub.onTransact$setServiceForeground$(IActivityManager.java:13167)
07-18
m/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars" exception: org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering File being compiled: /home/user256/work/TVE1086/system/frameworks/base/services/permission/java/com/android/server/permission/access/AccessCheckingService.kt The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:49) at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:241) at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException$default(CodegenUtil.kt:236) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invokeSequential(performByIrFile.kt:68) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:55) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:41) at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96) at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:29) at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96) at org.jetbrains.kotlin.backend.common.phaser.CompilerPhaseKt.invokeToplevel(CompilerPhase.kt:43) at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.invokeCodegen(JvmIrCodegenFactory.kt:312) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.runCodegen(KotlinToJVMBytecodeCompiler.kt:348) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:123) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:47) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:167) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:101) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:47) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:79) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:43) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit(CLITool.kt:179) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit$default(CLITool.kt:177) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMain(CLITool.kt:166) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler$Companion.main(K2JVMCompiler.kt:250) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.main(K2JVMCompiler.kt) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.jetbrains.kotlin.preloading.Preloader.run(Preloader.java:87) at org.jetbrains.kotlin.preloading.Preloader.main(Preloader.java:44) Caused by: java.lang.RuntimeException: Exception while generating code for: FUN name:initialize visibility:public modality:FINAL <> ($this:com.android.server.permission.access.AccessCheckingService) returnType:kotlin.Unit $this: VALUE_PARAMETER name:<this> type:com.android.server.permission.access.AccessCheckingService BLOCK_BODY SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:packageManagerInternal type:android.content.pm.PackageManagerInternal? visibility:private' type=kotlin.Unit origin=null receiver: GET_VAR '<this>: com.android.server.permission.access.AccessCheckingService declared in com.android.server.permission.access.AccessCheckingService.initialize' type=com.android.server.permission.access.AccessCheckingService origin=null value: CALL 'public open fun getService <T> (type: @[FlexibleNullability] java.lang.Class<@[FlexibleNullability] T of com.android.server.LocalServices.getService?>?): @[FlexibleNullability] T of com.android.server.LocalServices.getService? declared in com.android.server.LocalServices' type=@[FlexibleNullability] android.content.pm.PackageManagerInternal? origin=null <T>: @[FlexibleNullability] android.content.pm.PackageManagerInternal? type: CALL 'public final fun <get-java> <T> (): java.lang.Class<T of kotlin.jvm.JvmClassMappingKt.<get-java>> declared in kotlin.jvm.JvmClassMappingKt' type=java.lang.Class<android.content.pm.PackageManagerInternal> origin=GET_PROPERTY <T>: android.content.pm.PackageManagerInternal $receiver: CLASS_REFERENCE 'CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:PackageManagerInternal modality:ABSTRACT visibility:public superTypes:[kotlin.Any]' type=kotlin.reflect.KClass<android.content.pm.PackageManagerInternal>
最新发布
08-12
<think>我们正在处理一个关于Struts 2启动过滤器异常的问题。根据用户描述,错误出现在启动Catalina容器时,涉及ContainerBase.addChild方法,并抛出RuntimeException和InvocationTargetException。错误指向ContainerBuilder.java的161行。用户还提供了几个引用,这些引用描述了类似的问题和可能的解决方案。 首先,我们需要分析常见的根本原因: 1. **类加载问题**:如引用[3]中提到的ClassNotFoundException,可能是由于类名配置错误(如filter-class中包含了".class"后缀)或缺少必要的JAR包。 2. **依赖冲突或版本不匹配**:引用[1]提到,如果导入了不需要的插件(如struts2-spring-plugin)而没有使用Spring,可能会导致问题。同时,Struts 2的不同版本对依赖的要求不同,比如在6.4.0中已经集成了XWork,不需要单独的XWork-core。 3. **配置文件错误**:struts.xml、web.xml等配置文件中的错误,如DTD声明不正确(引用[1]提到升级时需要修改DTD版本)或filter配置错误。 4. **项目构建问题**:引用[4]提到,在项目结构中可能存在文件丢失,需要检查并修复。 用户的具体错误信息是: ERROR org.apache.catalina.core.ContainerBase Catalina localhost 启动失败 java.lang.RuntimeException java.lang.reflect.InvocationTargetException at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBuilder.java:161) 这个错误通常发生在Tomcat尝试部署Web应用程序时,在添加子容器(如Context)时失败。根本原因可能隐藏在InvocationTargetException中,我们需要查看更底层的异常。 解决步骤: 1. **检查控制台日志**:查找InvocationTargetException之后的第一个“Caused by”部分,以确定根本原因。可能是缺少类、配置文件错误或初始化失败。 2. **检查web.xml中的过滤器配置**: - 确保`<filter-class>`正确,如引用[3]中提到的,不应该有“.class”后缀。正确的类名是`org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter`(对于Struts 2.5+,包括6.4.0)。注意:在Struts 2.5之前,使用的是`org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter`(注意“ng”),但新版本已经去掉“ng”。 - 示例配置: ```xml <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> ``` 3. **检查依赖**: - 确保项目中只包含必要的Struts 2依赖。对于Struts 2.6+(包括6.4.0),核心依赖是`struts2-core`(Maven坐标:`org.apache.struts:struts2-core:6.4.0`)。 - 检查是否有重复或冲突的依赖(例如,同时存在多个版本的Struts 2核心库或XWork)。 - 移除不必要的插件:例如,如果没有使用Spring,就不要包含`struts2-spring-plugin`;同样,检查其他插件(如JSON插件、JFreeChart插件等)是否与当前版本兼容。 4. **检查配置文件**: - `struts.xml`:确保DTD声明正确(对于Struts 2.5+,应使用2.5的DTD)。同时检查包定义、拦截器配置等。 - 检查是否有多个配置文件冲突(例如,在多个JAR包中包含struts.xml)。 5. **项目结构检查**: - 确保所有依赖的JAR包都放在`WEB-INF/lib`目录下(对于非Maven项目)。 - 如果是使用IDE(如IntelliJ IDEA),检查项目结构(Project Structure)中是否有问题(如引用[4]所述),确保所有模块的依赖正确。 6. **类路径问题**:确保没有重复的类(例如,同一个类出现在多个JAR中)或版本冲突。可以使用`mvn dependency:tree`(Maven项目)来查看依赖树。 7. **日志配置**:增加Struts 2和Tomcat的日志级别(如DEBUG),以获取更详细的错误信息。可以在`struts.xml`中配置: ```xml <constant name="struts.devMode" value="true" /> ``` 由于用户没有提供具体的“Caused by”异常,我们只能根据常见情况给出建议。但是,根据引用[1]和[3]的经验,以下两种可能性较大: 可能性1:过滤器类名配置错误(如引用[3]的情况) - 解决:检查web.xml中的filter-class,确保没有多余的后缀(如“.class”),并且类名完全正确。 可能性2:缺少依赖或依赖冲突(如引用[1]的情况) - 解决:检查是否引入了不必要的插件(如struts2-spring-plugin)而没有配置Spring,或者缺少核心依赖。 如果上述步骤不能解决问题,请用户提供更详细的异常堆栈(特别是“Caused by”部分)。 相关问题: 1. 如何解决Struts 2启动时的ClassNotFoundException? 2. 如何配置Struts 2的web.xml过滤器? 3. 如何排除Struts 2依赖冲突? 4. 如何升级Struts 2到最新版本(6.4.0)? 5. 如何调试Struts 2的启动错误? 注意:在回答中,我们引用了用户提供的引用[1]、[3]和[4],所以我们在适当的地方添加了引用标记。</think>### Struts 2 启动过滤器异常解决方案 当遇到 `ContainerBase.addChild: start` 错误并伴随 `RuntimeException` 和 `InvocationTargetException` 时,通常由以下原因引起。请按顺序排查: #### 1. **检查过滤器类名配置**(最常见错误) 在 `web.xml` 中确认过滤器类名是否正确: ```xml <!-- 正确配置(注意无.class后缀) --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> ``` - **错误示例**:`org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class`(多余的后缀)[^3] - **解决方案**:删除类名中的 `.class` 后缀 #### 2. **验证依赖完整性** Struts 6.4.0 核心依赖: ```xml <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>6.4.0</version> </dependency> ``` - **关键检查点**: - 移除所有 `xwork-core*.jar`(6.x 已内置) - 检查是否误添加了不兼容插件(如 `struts2-spring-plugin` 在非Spring项目中)[^1] - 使用命令验证依赖树: ```bash mvn dependency:tree -Dincludes=org.apache.struts ``` #### 3. **配置文件诊断** 在 `struts.xml` 中启用开发模式: ```xml <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.configuration.xml.reload" value="true" /> </struts> ``` - 检查 `struts-default.xml` 加载问题: - 确认 `struts2-core-6.4.0.jar` 中的 `/struts-default.xml` 文件是否完整 - 避免自定义包名与系统包冲突 #### 4. **项目结构修复** 针对 IDE 配置问题: 1. 在 IntelliJ/Eclipse 中检查项目结构: - 确保 `WEB-INF/lib` 包含所有 Struts JAR - 修复 "Problem" 面板中的依赖缺失警告(点击 [Fix] 按钮)[^4] 2. 清理部署缓存: - 删除 `work/Catalina` 和 `temp` 目录(Tomcat) - 执行 `mvn clean install` #### 5. **日志深度分析** 在 `log4j2.xml` 中添加调试配置: ```xml <Configuration> <Loggers> <Logger name="com.opensymphony.xwork2" level="debug" /> <Logger name="org.apache.struts2" level="trace" /> </Loggers> </Configuration> ``` - 关键日志线索: - 查找首个 `Caused by:` 的堆栈跟踪 - 检查 `ClassNotFoundException` 的具体类名 - 关注 `struts-default.xml` 加载过程中的 OGNL 错误 #### 典型错误场景解决 | 错误现象 | 解决方案 | |---------|---------| | `java.lang.ClassNotFoundException: ...StrutsPrepareAndExecuteFilter` | 修正 `web.xml` 的过滤器类名[^3] | | `Caught exception while loading file struts-default.xml` | 移除冲突插件(如 struts2-spring-plugin)[^1] | | `ContainerBase.addChild: start` 无详细错误 | 检查项目依赖完整性[^4] | | OGNL 表达式错误 | 升级至 OGNL 3.3.4(Struts 6.4.0 内置) | > **重要提示**:80% 的启动错误源于 (1) 过滤器类名配置错误 或 (2) 依赖冲突。建议先检查这两个点[^1][^3]。 --- ### 相关问题 1. 如何正确配置 Struts 2.6+ 的过滤器类名? 2. Struts 6.4.0 需要哪些核心依赖项? 3. 如何诊断 `struts-default.xml` 加载失败的根本原因? 4. 解决 Tomcat 部署时 `ContainerBase.addChild` 错误的通用方法? 5. Struts 2 项目从 Tomcat 8 迁移到 Tomcat 10 需要注意什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值