簡體   English   中英

程序在不使用try and catch時報告異常

[英]Program reports exceptions when not using try and catch

我對Java還是很陌生,並且正在從事加密技術方面的學校作業。 當我尋找從文件中讀取的方法時,我看到許多方法都有try and catch塊。 我對它們的使用不是很熟悉,我想嘗試避免在代碼中使用它們,但是當我刪除它們時,在new FileReader的new和reader.readLine()之后的括號中報告了兩個異常。 但是,如果我確實使用它們,則效果相對較好。 誰能解釋發生了什么事? 另外,當使用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;
    }
}

最好不要按原樣捕獲異常,因為您將丟棄兩條最有用的信息,即拋出了哪個異常以及異常發生在哪里。

您可以將異常添加到main()throws子句中,而不是捕獲異常。

例如

public static void main(String[] args) throws IOException {
    // ...
}

誰能解釋發生了什么事?

當您讀取文件時,您可能是IOException例如,如果文件不存在。 您可能必須捕獲此異常,但現在可以讓調用者將main打印出來(如果發生)。

同樣在使用catch並嘗試編碼時我得到異常Null

這意味着您正在觸發異常而沒有消息。 如果打印異常及其發生的位置(或讓JVM為您處理),您將看到異常的位置。

為了確定為什么會發生這種情況,建議您逐步調試程序中的代碼,以便您了解每一行的功能。

粘貼形式的主要方法通常是程序的入口點,而不會被其他Java代碼調用。 因此,在離開程序之前,捕獲並處理所有異常是一個好習慣。

“句柄”可能意味着不同的含義:

  1. 只需像執行操作那樣將異常消息打印到控制台(在這種情況下,您會丟失信息,正如Peter Lawrey指出的那樣)。
  2. 打印stacktrace(e.printStackStrace()),它會在stderr輸出上輸出有關異常的更多信息。 如果main()方法留下未捕獲的異常,這就是Java所做的。
  3. 如果使用記錄器框架:記錄器及其附加程序能夠將所有異常信息打印到您選擇的目標位置。
  4. 處理它(1-3)並使用退出代碼!= 0退出Java,以便應用程序的(程序)調用者可以處理錯誤情況。

BTW1:我什至會抓住Throwable。 因此,您還會捕獲可能的未經檢查的異常(NullPointerException,ArrayIndexOutOfBoundsException等)。 並將嘗試放在最開始的位置(如果您在訪問args數組時出錯,那么您還將涵蓋ArrayIndexOutOfBoundsException)

BTW2:如果您在main方法中沒有任何try..catch,我認為代碼甚至不會編譯,因為編譯器可以檢測到可能存在未處理的檢查異常(來自IO操作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM