"String.substring(int, int) line: not available" 导致错误

"String.substring(int, int) line: not available" causes error

我的 if 循环使用子字符串检查 .txt 文件不知何故导致了问题。没有 if 循环,一切正常。但是有了它,似乎文本文件中的空行导致它崩溃。它一直工作到文件中的第一个空行,然后我收到此错误。我该怎么办?

代码:

public class S1_Blockchain extends ConsoleProgram {

    public void init() {
        setSize(400, 250);
        setFont("Arial-bold-18");

        BufferedReader br = null;
        String line;
        
        try {
            br = new BufferedReader(new FileReader("block_chain.txt"));
            while((line = br.readLine()) != null){
                if(line.substring(0,1).equals("T") || line.substring(0,1).equals("G")) {
                   System.out.println(line);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
    }
}

您可能还想检查空字符串:

if( !line.trim().isEmpty() && (line.substring(0,1).equals("T") || line.substring(0,1).equals("G"))) { ... }

然后您可能还想重构代码以使其更具可读性:

public class S1_Blockchain extends ConsoleProgram {

    public void init() {
        setSize(400, 250);
        setFont("Arial-bold-18");

        BufferedReader br = null;
        String line;
        
        try {
            br = new BufferedReader(new FileReader("block_chain.txt"));
            while((line = br.readLine()) != null){
                if(shouldConsider(line)) {
                   System.out.println(line);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
    }
}

private boolean shouldConsider(String line){
  return !line.trim().isEmpty() 
         && 
         (line.substring(0,1).equals("T") || line.substring(0,1).equals("G"));
}

除了检查您的字符串是否为空之外,您还必须检查它是否为空字符串 ("")。您可以将其检查为 line.trim().legth() == 0;line.isEmpty(),但也有名为 StringUtils 的 Apache Utils。有一种方法 isBlank(String str) 可以一次性检查 String 是否为 null 或空白。这就是我推荐的

因此,您针对 empty 字符串 ""(不幸的路径)测试了第一个边缘案例。

接下来你可以通过使用trim()(移除周围的空白)来避免有效的空情况:

  • " Trouble Centered " 这样的间隔输入变成 trimmed `“以问题为中心”(因此以可能需要的“T”开头)。
  • 空白行,如" "变成字符串""(这会破坏一些测试)
        br = new BufferedReader(new FileReader("block_chain.txt"));
        while((line = br.readLine()) != null){
            line = line.trim(); // remove white-spaces; blank line results as empty
            if (line.isEmpty()) {
              // might handle or ignore this case
            }

            firstChar = line.charAt(0);  // expresses intend better than substring
            if (Set.of('T', 'G').contains(firstChar) { // the Set improves readability for condition
               System.out.println(line);
            }
        }

测试字符串的替代方法

A) 单独测试:

  • 也可以使用 line.isBlank()
  • 测试空(甚至没有空格)或空白(只有空格)
  • 也可以用line.startsWith("T")
  • 测试字符串的开头

B) 合二为一(你的情况):

  • 使用 正则表达式 捕捉所有情况:line.matches("^\s*(G|T)")