输入/输出运行时错误

时间:2015-05-08 02:56:17

标签: java

我有三个程序要为我的面向对象编程课程编写,所有程序都涉及文件输入/输出,每个程序都没有编译错误,但是他们没有在运行时做到他们应该做的事情(他们没有'打印到outFile,就像他们应该的那样)。

我知道正在读取输入文件并将其保存在正确的位置,因为Eclipse会指出其中任何一个都不是这种情况。

此外,我(据我所知)没有提交任何常见错误,包括不包括关闭读/写文件的抛出异常。

我在这里附加了我的第一个i / o作业,希望其他文件有类似的错误,一旦我弄清楚这个错误,我就能解决。

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();
}
}

以下是Lab8_TestFile.txt的内容

4
6
2
10
8
1
-1
-2147483648
2147483647
5
9
3
7
-7

2 个答案:

答案 0 :(得分:0)

正如其他评论者指出的那样,从

更改countLines函数中的代码
    String nextLine = inFile.readLine();
    while( nextLine != null ) {
        lineNumber ++;
    }

    while (inFile.readLine() != null) {
        lineNumber ++;
    }

通过此更改,您的程序可以按预期工作。

答案 1 :(得分:0)

您的代码存在多处问题。让我们从头开始:你的countLines方法不能按预期工作,并且会创建一个无限循环,因为你的while条件永远不会被评估为false(除非你的文件为空): / p>

// String nextLine = inFile.readLine();
// while(nextLine != null) {
while (inFile.readLine() != null) {
    lineNumber++;
}

您可能需要检查Number of lines in a file in Java以获取检索文件行数的速度更快,效果更好的版本。

此外,您的readValues函数会为其想要读取的每一行打开文件,读取文件直到该行并再次关闭文件 - &gt;的 BAD 即可。你应该做的是以下几点:

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数组来传递,所以这并不是很好。如果你仍然希望将行数与读取值分开,那么这样做,但是让readValues自己处理适当的阅读。这可能会导致类似:

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;
}

这样,您只需解析文件一次即可读取值。如果你需要返回一个int [],请查看How to convert an ArrayList containing Integers to primitive int array?以了解如何从给定的数据结构中提取它。

您的主要功能可能会导致类似:

public static void main(String[] args) throws IOException {
    int numberOfLines = countLines(); // technically no longer needed.
    int[] intContents = convertIntegers(readValues());
    printOdd(intContents);
}