"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)")
我的 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)")