Exception in thread “main“ 主线程异常的解决方法

简介: Exception in thread “main“ 主线程异常的解决方法

项目场景:

       编写氪金游戏,充值抽卡系统的代码,将Scanner类中的创建,和关闭Scanner对象,同时写进了for循环内,导致主线程异常。

问题描述  

       半成品的充值抽卡代码:

import java.util.Scanner;
public class ChouKa {
  private static int yuanShi=0;
  public static void main(String[] args) {
    for(int j=0;j<10;j++) {   
      Scanner sc=new Scanner(System.in);
            //导致BUG的代码
      System.out.println("您是否要充值?(true or false)");
      boolean chongZhi=sc.nextBoolean();
      if(chongZhi==true){
          System.out.println("请输入您的充值金额(元)");
          int money=sc.nextInt();   
          int yuanShiC=money*10;
          System.out.println("邮箱提醒:到账原石"+yuanShiC);
          yuanShi+=yuanShiC;
        }
        System.out.println("原石:"+yuanShi);
        sc.close(); 
            //导致BUG的代码
    }
  }
}

报错如下:  

       编写过程期间,循环充值抽卡代码。第一次输入充值金额,正常运行代码;到第二次运行时,用户不能输入数据,无法运行代码,报错显示,主线程异常。


原因分析:

       在循环中创建和关闭Scanner对象,可能会导致主线程异常


       第一,Scanner是一个阻塞式IO操作,Scanner对象在读取用户输入时,会导致主线程阻塞,程序停止继续执行,流正在等待来自用户的输入,例如从键盘读取输入。在这种情况下,流将阻塞


       第二,用户输入完毕内容,关闭Scanner对象,它也关闭了底层输入源,例如文件或流。如果在循环的下一次迭代中创建了一个新的Scanner对象,但是输入源已经关闭,那么在对新的Scanner对象调用next()时可能会导致抛出异常


       往深了讲,原因是源码中的nextBoolean()方法只读取布尔值,而不使用留在输入缓冲区中的换行字符(\n)。当程序执行到循环的下一个迭代并创建一个新的Scanner对象时,nextInt()方法将读取前一个迭代中留在输入缓冲区中的换行符,而不是等待来自用户的新输入。这将导致程序跳过用户输入的下一个提示,直接进入下一个迭代,从而用户无法输入,代码无法继续运行,主线程发生异常。


      弊端:在循环中反复创建和关闭Scanner对象,相比在循环过程之外进行此操作,计算机操作更复杂,运行内存和时间占用的更多,同时系统反应的会更慢


      因此,在循环中应该避免创建和关闭Scanner对象。最佳实践是在循环外创建Scanner对象,然后在循环中重复使用该对象,以避免阻塞主线程


相关文章
|
JavaScript API
required string parameter ‘XXX‘is not present 的几种情况
required string parameter ‘XXX‘is not present 的几种情况
3744 0
|
7月前
|
弹性计算 API 数据安全/隐私保护
阿里云服务器如何续费?续费有没有优惠?通常具体有哪些优惠?
本文主要介绍阿里云服务器包年包月实例的续费方法,包括PC端、阿里云App端和API/CLI续费的具体步骤。同时,文章还探讨了续费优惠的类型及规则,如限时活动优惠、长期折扣政策、节省计划与预留实例券等,帮助用户最大化利用优惠,降低长期使用成本。此外,还介绍了续费过程中的注意事项,如自动续费限制、续费变配选项等,确保云服务器的稳定运行和数据安全。
|
9月前
|
人工智能 决策智能
2026年美赛C题——翻译及建模完整思路
《与星共舞》美国版(34季)融合评委打分与观众投票决定淘汰。本文基于公开数据,构建数学模型反推保密的观众投票数,对比排名法与百分比法效果,分析杰瑞·莱斯等争议选手案例,并评估舞者、明星特质影响,最终提出更公平、具观赏性的新票分融合体系。(239字)
1223 1
|
监控 Linux
Linux systemd 服务启动失败Main process exited, code=exited, status=203/EXEC
通过以上步骤,可以有效解决 systemd 服务启动失败并报错 `Main process exited, code=exited, status=203/EXEC` 的问题。关键在于仔细检查单元文件配置、验证可执行文件的有效性,并通过日志分析具体错误原因。确保可执行文件路径正确、文件具有执行权限,并且可以独立运行,将有助于快速定位和解决问题。
7121 7
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
740 1
|
关系型数据库 MySQL 数据库
【MySQL】手把手教你MySQL数据同步
【MySQL】手把手教你MySQL数据同步
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
4805 2
|
机器学习/深度学习 数据安全/隐私保护 UED
淘宝图片搜索接口开发指南:从图像识别到商品匹配的全流程实现
图片搜索技术极大提升了电商用户体验。本文详解淘宝图片搜索接口的实现原理与开发实战,涵盖预处理、特征提取、比对与结果返回等核心流程,并提供可复用代码。内容还包括常见错误处理、合规性开发注意事项及多种扩展应用场景,助力开发者快速构建高效、合规的图片搜索功能。
淘宝图片搜索接口开发指南:从图像识别到商品匹配的全流程实现

热门文章

最新文章