Java 输入/输出运行时错误
我要为我的面向对象编程课程编写三个程序,所有程序都涉及文件输入/输出,每个程序都不包含编译错误,但它们在运行时并没有执行它们应该执行的操作(它们不会像应该执行的那样打印到输出文件) 我知道正在读取输入文件并将其保存在正确的位置,因为Eclipse将指示是否存在这两种情况 此外,据我所知,我没有犯过任何涉及不包括关闭读/写文件的异常的常见错误 我在这里附上我的第一个I/o分配,希望其他文件也有类似的错误,只要我能找出这个文件的错误,我就可以修复Java 输入/输出运行时错误,java,Java,我要为我的面向对象编程课程编写三个程序,所有程序都涉及文件输入/输出,每个程序都不包含编译错误,但它们在运行时并没有执行它们应该执行的操作(它们不会像应该执行的那样打印到输出文件) 我知道正在读取输入文件并将其保存在正确的位置,因为Eclipse将指示是否存在这两种情况 此外,据我所知,我没有犯过任何涉及不包括关闭读/写文件的异常的常见错误 我在这里附上我的第一个I/o分配,希望其他文件也有类似的错误,只要我能找出这个文件的错误,我就可以修复 import java.io.*; public
import java.io.*;
public class GreenK4_Lab8 {
public static void main(String[] args) throws IOException {
int[] numbers = new int[countLines()];
int i = 0;
for(i = 0; i < numbers.length; i++) {
numbers[i] = readValues(i);
}
printOdd(numbers);
}
public static int countLines() throws IOException {
BufferedReader inFile = new BufferedReader(
new FileReader( "Lab8_TestFile.txt" ) );
int lineNumber = 1;
String nextLine = inFile.readLine();
while( nextLine != null ) {
lineNumber ++;
}
inFile.close();
return lineNumber;
}
public static int readValues(int number) throws IOException {
BufferedReader inFile = new BufferedReader(
new FileReader( "Lab8_TestFile.txt" ) );
int value = 0;
for(int i = 0; i < number; i++) {
String nextLine = inFile.readLine();
value = Integer.parseInt( nextLine );
}
inFile.close();
return value;
}
public static void printOdd(int[] array) throws IOException {
PrintWriter outFile = new PrintWriter( "results.out" );
for(int i = 0; i < array.length; i++) {
int value = array[i];
if( value % 2 != 0)
outFile.println( value );
}
outFile.close();
}
}
正如其他评论者所指出的,将countLines函数中的代码从
String nextLine = inFile.readLine();
while( nextLine != null ) {
lineNumber ++;
}
到
通过此更改,您的程序可以按预期工作。您的代码有多处错误。让我们从头开始:您的
countLines
方法无法按预期工作,将创建一个无限循环,因为您的while条件永远不会被计算为false
(除非您的文件为空):
您可能需要检查检索文件行数的更快、性能更好的版本
此外,您的readValues
函数为它要读取的每一行打开文件,读取文件直到该行,然后再次关闭文件->坏的。您应该做的是:
public static void readValues(int[] contentsOfFile) throws IOException {
BufferedReader inFile = new BufferedReader(new FileReader("Lab8_TestFile.txt"));
for(int i = 0; i < contentsOfFile.length; i++) {
String nextLine = inFile.readLine();
contentsOfFile[i] = Integer.parseInt( nextLine );
}
inFile.close();
}
这样,您只需解析文件一次即可读取值。如果需要返回int[],请查看以了解如何从给定的数据结构中提取int[]
您的主要功能可能会产生如下结果:
public static void main(String[] args) throws IOException {
int numberOfLines = countLines(); // technically no longer needed.
int[] intContents = convertIntegers(readValues());
printOdd(intContents);
}
请删除所有无用的评论。用
Declare integer注释int i=0
,i并给它赋值0
是完全无用的,会弄乱代码。“它们不会像预期的那样打印到输出文件”。接下来会发生什么?nextLine!=空值
条件永远不会改变-您应该使用类似于while((nextLine=infle.readLine())!=null)
或简单的while(infle.readLine()!=null)
JB Nizet:无法同意您更多的评论。然而,不幸的是,这正是我的教授想要的。他说我们的评论应该逐行描述代码的功能。如果我在这里做了其他的事情,我会因为他称之为“预先加载我的评论”而失去分数。Tichodroma:它根本不会创建输出文件。rzysia:事实上,下一条线的条件已经改变了。实际上,infie.readLine方法的功能与您刚才描述的类似。您只是看不到代码,因为该方法是从Java库调用的。当我将该方法插入while循环时,我可能会尝试查看程序执行的操作。也许我误解了readLine方法的工作原理。我对此表示怀疑,因为我记得我们的教授给了我们该部分的代码,但值得一试。
// String nextLine = inFile.readLine();
// while(nextLine != null) {
while (inFile.readLine() != null) {
lineNumber++;
}
public static void readValues(int[] contentsOfFile) throws IOException {
BufferedReader inFile = new BufferedReader(new FileReader("Lab8_TestFile.txt"));
for(int i = 0; i < contentsOfFile.length; i++) {
String nextLine = inFile.readLine();
contentsOfFile[i] = Integer.parseInt( nextLine );
}
inFile.close();
}
public static ArrayList<Integer> readValues() throws IOException {
BufferedReader inFile = new BufferedReader(new FileReader("Lab8_TestFile.txt"));
ArrayList<Integer> integerContents = new ArrayList<>();
String nextLine = null;
while ((nextLine = inFile.readLine()) != null) {
integerContents.add(Integer.parseInt(nextLine));
}
inFile.close();
return integerContents;
}
public static void main(String[] args) throws IOException {
int numberOfLines = countLines(); // technically no longer needed.
int[] intContents = convertIntegers(readValues());
printOdd(intContents);
}