什么是错误终止程序的最佳方法?

时间:2016-05-09 10:16:05

标签: java

您认为在捕获异常并在主函数中处理它之后关闭程序的最佳方法是什么?

  1. 返回
  2. System.exit(...)
  3. 重新抛出异常
  4. 将自定义异常作为包装器抛出
  5. 抛出运行时异常
  6. 别的东西

    public static List<String> readFile(String file)
            throws NoSuchFileException, EOFException, IOException {
        Path p = Paths.get(file);
        if (!Files.exists(p)) {
            throw new NoSuchFileException(file);
        } else if (!Files.isRegularFile(p)) {
            throw new NoRegularFileException(file);
        } else if (!Files.isReadable(p)) {
            throw new AccessDeniedException(file);
        } else if (Files.size(p) == 0) {
            throw new EOFException(file);
        }
        return Files.readAllLines(p);
    }
    
    public static void main(String[] args) {
        try {
            if (args.length != 2) {
                System.out.println("The proper use is: java MyProgram file1.txt file2.txt");
                return;
            }
    
            List<List<String>> files = new ArrayList<>();
            for (String s : args) {
                try {
                    files.add(Utilities.readFile(s));
                } catch (NoSuchFileException e) {
                    System.out.printf("File %s does not exist%n", e.getMessage());
                    System.exit(-1);
                } catch (NoRegularFileException e) {
                    System.out.printf("File %s is not a regular file%n", e.getMessage());
                    throw e;
                } catch (AccessDeniedException e) {
                    System.out.printf(
                        "Access rights are insufficient to read file %s%n", e.getMessage()
                    );
                    throw new ReadFileException(e);
                } catch (EOFException e) {
                    System.out.printf("File %s is empty%n", e.getMessage());
                    throw new RuntimeException(e);
                }
            }
            //some other code
        } catch (Exception e) {
            e.printStackTrace();
        }
    
  7. 编辑:我应该已经明确表示在main结束之前程序中还会有其他代码,所以我不能让它完成。

1 个答案:

答案 0 :(得分:0)

如果你希望它是干净的(即不向用户显示堆栈跟踪),那么抛出异常是不可能的(至少在主要之外)。然后就是否要从程序中返回退出代码。

如果要返回退出代码,则必须使用System.exit(int errcode);。否则你可以返回(或让main正常退出)。