如何读取文本文件的内容并检查它们在 Java 中是否有效

如何解决如何读取文本文件的内容并检查它们在 Java 中是否有效

我对 Java 编程和编程还很陌生。目前我正在学习异常以及如何处理它们。在这个实验室中,我得到了多个文本文件,其中包含网格状的数字。我被告知使用命令行参数一次运行所有文件。

The way the text files look (screenshot)

所有文件都被命名为有效或无效。无效文件中有一些我必须检查的独特错误。每个文本文件的第一行给出总行数和列数。我一直在想如何检查文本文件的有效性:invalid2、invalid5 和 invalid7。我可以编写一些错误的代码来捕获文件 invalid5 和 invalid7 中的错误(我不想这样做),但是 invalid2 真的让我很难受。 invalid2 的问题是文件中的第一行告诉我网格有 3 行4 列,但实际的网格有4 行3 列

invalid2 text file screenshot

我目前正在尝试将网格分成单独的行。我的逻辑(这里是我想知道它是否有问题的地方)是我正在使用一个 while 循环来检查文本文件中是否有下一行。如果有,我将增加我的行计数器(即使我已经知道网格有多少行)。然后我检查行计数器是否大于给定的实际行数,这会引发行数过多的异常。如果没有,我将继续解析网格的每一行。我使用一个字符串“nextLine”,它包含网格的那一行中的所有数字,并使用扫描器“解析”解析该字符串。我使用的 for 循环次数与列数相同(文件给出的 #)。然后我设置 double 类型的变量“num”以获取该字符串中的下一个双精度值。在这一点上,我的程序崩溃了。我不知道为什么在我的代码中的那一行出现 NoSuchElementException。 Screenshot on Eclipse 我真的不需要对我从文件中读取的信息做任何事情,所以“num”变量就在那里移动到行中的下一个数字。

我有两个问题

  1. 为什么我在代码的那部分收到 NoSuchElementException?
  2. 我尝试检查每个文本文件有效性的逻辑是否正确?

控制台的输出应该是这样的:

valid1.dat

有效

invalid1.dat

java.lang.NumberFormatException:对于输入字符串:“X”

无效

等等...

这是我的代码:

public class FormatChecker {

public static void main(String[] args) {
    
    for(int n = 3; n < args.length; n++) {              // Loops through command-line arguments
        String fileName = args[n];                      // Sets specific file 
        try {           
            File file = new File(fileName);             // new File from specified file name
            Scanner read = new Scanner(file);           // Scanner object to read the new file
            String firstLine = read.nextLine();         // String to hold the first line of the file
            Scanner parse = new Scanner(firstLine);     // Scanner object to parse the first line (reads first line)
            
            int row = parse.nextInt();          // Gets first token from Scanner object 'parse' to get # of rows
            int col = parse.nextInt();          // Gets second token from Scanner object 'parse' to get # of columns
            
            if(parse.hasNext()) {               // Checks if there are more than two tokens (for invalid4.dat)
                throw new GridSizeException("Too many dimensions"); // If yes,throws created exception "GridSizeException"
            } else {                // HERE IS WHERE I NEED HELP W/ MY LOGIC!
                int rowCount = 0;                   // Row counter even thought we already know the # of rows
                while(read.hasNextLine()) {         // While loop that loops until the end of the file
                    rowCount++;                     // row count is increased
                    if(rowCount > row) {            // if row counter is > than our given # of rows,we will throw an exception
                        throw new GridSizeException("Too many rows");
                    }
                    String nextLine = read.nextLine();          // String to hold the next line of the file
                    parse = new Scanner(nextLine);              // For parsing that next line
                    for(int j = 0; j < col; j++) {              // Loops the same # of times as the # of columns
                        double num = parse.nextDouble();        // Move through the String
                        if(j == col-1 && parse.hasNext()) {     // Checks if there are more numbers in that row than expected.
                            throw new GridSizeException("Too many columns");
                        }
                    }                           
                }                       

                System.out.println(fileName);
                System.out.println("VALID");
                System.out.println();
                
            }               
            
        } catch (FileNotFoundException e){
            System.out.println(fileName);
            System.out.println(e.toString() + " for input string: " + fileName);
            System.out.println("INVALID\n");
        } catch (NumberFormatException e) {
            System.out.println(fileName);
            System.out.println(e.toString() + " for input string: " + fileName);
            System.out.println("INVALID\n");
        } catch (InputMismatchException e) {
            System.out.println(fileName);
            System.out.println(e.toString() + " for input string: " + fileName);
            System.out.println("INVALID\n");
        } catch (GridSizeException e) {
            System.out.println(fileName);
            System.out.println(e.toString() + " for input string: " + fileName);
            System.out.println("INVALID\n");
        }
    }
}

}

解决方法

当你用扫描仪读取行时,使用 string.split(" ") (或任何分隔值的东西)

split() 的结果是一个字符串数组,你可以

  • 使用 array.length 检查值的数量(并确定是否有足够的值,否则有错误)
  • 将单个字符串转换为数字并捕获异常(如果数字无效)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-