-1

我正在尝试将二进制文件中的数据读入二维数组,同时整理出最大数据点(在 int[] 中)之上的任何负数或值。我可以让数组在没有异常的情况下正确填充,但是对于超出可接受范围的数据抛出异常是必需的。当我添加异常时,数组永远不会超过第一行。任何见解将不胜感激。

public class DataExceedsMaxDataPoint extends Exception {
    public DataExceedsMaxDataPoint() {
        super("Error: Data Exceeds Maximum Data Point");
    }

    public DataExceedsMaxDataPoint(int number, int maxData) {
        super("Error: Data(" + number + ") Exceeds Maximum Data Point(" +
                maxData + ")");
    }
}

public class NegativeData extends Exception {
    public NegativeData() {
        super("Error: NegativeData Not Allowed");
    }

    public NegativeData(int number) {
        super("Error: Negative Data(" + number + ") Not Allowed");
    }
}

import java.io.*;

public class ChemExpDataValidation2 {
    public static void main(String[] args) throws IOException {
        int[] dataMax = {35, 55, 72, 75, 45, 100}; //max data points
        int[][] chemData = new int[6][10];
        int number;
        int maxData;
        boolean endOfFile = false;

        FileInputStream fstream = new FileInputStream("data.dat");
        DataInputStream inputFile = new DataInputStream(fstream);

        System.out.println("Reading numbers from the file:");

        while (!endOfFile) {
            try {
                for (int row = 0; row < 6; row++) {
                    maxData = dataMax[row];
                    for (int col = 0; col < 10; col++) {
                        number = inputFile.readInt();
                        if (number <= maxData && number > 0) {
                            chemData[row][col] = number;
                        }
                        if (number > maxData) {
                            throw new DataExceedsMaxDataPoint(number, maxData);
                        }
                        if (number < 0) {
                            throw new NegativeData(number);
                        }
                    }
                }
                for (int row = 0; row < 6; row++) {
                    for (int col = 0; col < 10; col++) {
                        System.out.printf("%4d", chemData[row][col]);
                    }
                    System.out.printf("\n");
                }
            } catch (DataExceedsMaxDataPoint e) {
                System.out.println(e.getMessage());
                continue;
            } catch (NegativeData e) {
                System.out.println(e.getMessage());
                continue;
            } catch (EOFException e) {
                endOfFile = true;
            }

        }
        inputFile.close();
        System.out.println("\nDone.");
    }
}
4

4 回答 4

1

你的要求没有意义。异常基本上会使 try 块所做的一切无效。如果正确构造并与 catch 块中的适当操作匹配,则理想情况下,该操作应准确恢复进入 try 之前存在的条件。

于 2013-05-26T02:32:11.367 回答
1

try/catch 块起初相当混乱,至少对我来说是这样。但是我喜欢看它们的方式是尝试一下,如果它不起作用,请不要使程序崩溃,而是跛行到终点线(或使用新变量再试一次,看看是否有效)。

try{
    someMethod(); // some method that could result in a crash of the program but want to try it
                 //if it works great but if not here is why but didn't blow up 
    Object = someOtherObject; // for example could be null, and throw an error but you want to try it first
}catch(Exception e){
    displayMessage(); // inform the user that the process couldn't go through 
                      //could also send yourself a copy of the stack trace 
}

该程序将继续,因为它“尝试”这样做但只是没有工作但能够返回。

当您说您可以毫无例外地填充它时,这意味着您的逻辑运行良好。我会把它全部放在 1 次 try/catch 中,如果它失败了,它会捕获它。把事情简单化 :)

希望这对您有所帮助或指出正确的方向。

于 2013-05-26T03:38:18.957 回答
0

如果无效记录确实符合异常,则抛出异常,并且没有其他“结果”。这实际上意味着无法从中恢复,并且继续执行此任务是没有意义的(这是 Scala 建议使用异常的方式)。

如果只是忽略无效记录,则不需要例外。如果还想返回无效记录列表,将成功记录和无效记录列表放在一个类中,然后返回这个。

一般来说,在导入数据时(尤其是从普通文件),我通常根本不使用任何异常,因为它很常见以至于存在验证问题。所以这并不是真正的例外,如果您提供完整的无效记录列表而不是在第一个错误之后立即抛出一个异常,用户会很高兴。

所以有时“如何正确抛出异常”的答案就是“根本不抛出任何异常”。

于 2013-05-26T07:02:18.667 回答
0

对于初学者来说,你的投掷没有多大意义。当发生异常行为时,您应该抛出异常,并且调用方法应该负责处理它。在这里,您既期待错误,又将其捕获在同一个方法块中,该方法块的流动方式不同。

简单地说,异常会破坏程序的自然流程。 如果 aThrowable出现在任何块中,则该特定块的执行将停止,并且仅处理catch/finally条件。您的问题 - 数据不会在第一行之后自行填充 - 受此影响;被认为是“异常”的东西会导致继续循环停止。

你有几个选择:

  • 不要与例外作斗争。 他们正在按预期工作 - 如果在进入时发生了一些异常状态,你的意思是你不希望代码继续超过那个点。通俗地说,传递有效数据。

  • 不要使用异常。如果您想忽略无效数据,那么首先没有真正的理由拥有它们。

  • 将例外情况分类到尽可能窄的范围内。try...catch您可以在读取 int 之后 放置块。更好的是,把它写成一个单独的方法来声明它的检查抛出,然后调用它:

    public static int checkValidInput(int number, int maxData)
            throws DataExceedsMaxDataPoint, NegativeData {
        if (number > maxData) {
            throw new DataExceedsMaxDataPoint(number, maxData);
        } else if (number < 0) {
            throw new NegativeData(number);
        } else {
             return number;
        }
    }
    

    for (int row = 0; row < 6; row++) {
        maxData = dataMax[row];
        for (int col = 0; col < 10; col++) {
            try {
                number = checkValidInput(inputFile.readInt(), maxData);
            } catch (DataExceedsMaxDataPoint e) {
                System.out.println(e.getMessage());
            } catch (NegativeData e) {
                System.out.println(e.getMessage());
            } catch (IOException e) { // generify the EOFException instead
                endOfFile = true;
            } 
        }
    }
    
于 2013-05-26T07:51:43.863 回答