程序在不使用try和catch时报告异常

时间:2016-10-31 19:32:07

标签: java cryptography try-catch bufferedreader

我还非常陌生,我正在从事加密工作的学校作业。当我在寻找从文件中读取的方法时,我看到许多人尝试了一下try块。我对这些内容的使用不太熟悉,我想尝试避免在我的代码中使用它们,但是当我删除它们时,我在new FileReader中的新内容和reader.readLine()之后的括号中报告了两个例外情况{1}}。但是,如果我使用它们,它的效果相对较好。任何人都可以解释发生了什么?此外,当使用catch并尝试在编码完成时我得到异常Null。任何帮助表示赞赏。

import java.io.*;
import java.util.*;

public class Encrypter {

    public static void main(String[] args) {

        File input = null;
        if (1 < args.length) {
            input = new File(args[1]);
        } else {
            System.err.println("Invalid arguments count:" + args.length);
            System.exit(0);
        }
        String key = args[0];
        BufferedReader reader = null;
        try {
            int i = 0;
            String[] inputText = new String[20];
            String[] encryptText = new String[20];
            reader = new BufferedReader(new FileReader(input));
            while ((inputText[i] = reader.readLine()) != null) {
                encryptText[i] = inputText[i];
                System.out.println(inputText[i]);
                ++i;
            }
            int hash = key.hashCode();
            Random random = new Random(hash);
            String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
            String alphabetPerm = alphabet;
            char temp;
            for (int j = 0; j < 100; j++) {
                int n1 = random.nextInt(27) + 0;
                int n2 = random.nextInt(27) + 0;
                char[] swapper = alphabet.toCharArray();
                temp = swapper[n1];
                swapper[n1] = swapper[n2];
                swapper[n2] = temp;
                String alphaSwap = new String(swapper);
                alphabet = alphaSwap;
            }
            System.out.println(alphabet);
            for (int k = 0; k < inputText.length; k++) {
                encryptText[k] = inputText[k].replaceAll("[^A-Za-z0-9 ]+", " ");
                for (int j = 0; j < inputText[k].length(); j++) {
                    int index = alphabetPerm.indexOf(encryptText[k].charAt(j));
                    encryptText[k] = alphabetSwapper(encryptText[k], alphabet, index, j);
                    System.out.println(encryptText[k]);
                }
            }
        } catch (Exception e) {
            System.err.println("Caught Exception: " + e.getMessage());
        }
    }

    public static String alphabetSwapper(String s, String alpha, int index, int value) {
        char toSwap = s.charAt(value);
        char[] inputChars = s.toCharArray();
        inputChars[value] = alpha.charAt(index);
        String swapped = new String(inputChars);
        return swapped;
    }
}

2 个答案:

答案 0 :(得分:2)

你最好不要以你的方式捕获异常,因为你丢弃了两个最有用的信息,抛出了异常以及它发生在哪里。

您可以在[{1}}

throws子句中添加例外,而不是捕获异常

e.g。

main()
  

任何人都可以解释发生了什么吗?

当您阅读文件时,您可能是public static void main(String[] args) throws IOException { // ... } ,例如如果文件不存在。您可能必须捕获此异常,但是现在您可以让调用者IOException将其打印出来。

  

同样在使用catch时尝试在编码完成时获得异常Null

这意味着您在没有消息的情况下触发异常。如果您打印异常及其发生的位置(或让JVM为您执行此操作),您将看到位置。

要确定发生这种情况的原因,我建议您逐步调试调试器中的代码,以便了解每行的内容。

答案 1 :(得分:0)

粘贴表单的主要方法通常是程序的入口点,而不是其他java代码调用的。因此,最好在离开程序之前捕获并处理所有异常。

'处理'可能意味着不同的事情:

  1. 只需将异常消息打印到控制台(就像Peter Lawrey已经指出的那样,你会丢失信息)。
  2. 打印stacktrace(e.printStackStrace()),它在stderr输出上输出有关异常的更多信息。如果main()方法留下未捕获的异常,这就是java所做的。
  3. 如果使用记录器框架:记录器及其Appender能够将所有异常信息打印到您选择的目的地。
  4. 处理它(1-3)并使用退出代码退出java!= 0,以便应用程序的(程序)调用者可以处理错误情况。
  5. BTW1:我甚至会抓住Throwable。因此,您还可以捕获可能未经检查的异常(NullPointerException,ArrayIndexOutOfBoundsException等)。并在最开始时放置try(如果在访问args数组时出错,那么你也会覆盖ArrayIndexOutOfBoundsException)

    BTW2:如果你在main方法中有任何try..catch我假设代码甚至不会编译,因为编译器可以检测到可能存在未处理的已检查异常(来自您的IO)操作)。