2016-10-31 8 views
0

Я все еще очень новичок в java, и я работаю над школьным заданием, которое работает над криптографией. Когда я искал методы для чтения из файлов, я видел, что у многих было блок try и catch. Я не очень хорошо знаком с их использованием, и я хочу попытаться избежать использования их в своем коде, но когда я их удалю, у меня есть два исключения, описанные в новом в new FileReader и в скобке после reader.readLine(). Но если я их использую, он работает относительно хорошо. Может ли кто-нибудь объяснить, что происходит? Также при использовании catch и try я получаю исключение Null, когда моя кодировка выполняется. Любая помощь приветствуется.Программа сообщает об исключениях, когда не используется try и catch

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

Вы лучше не ловить, за исключением, как вы, потому что вы выбрасываете две самые полезные части информации, которая исключение брошенной и где это произошло.

Вместо того, чтобы ловить исключение, вы можете добавить исключения к статье о main()

например throws

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

Может кто-нибудь объяснить, что происходит?

Когда вы читаете файл, вы можете указать IOException, например. если файл отсутствует. Возможно, вам придется поймать это исключение, но пока вы можете позволить вызывающему абоненту main распечатать его, если это произойдет.

Также при использовании поймать и попробовать я получаю Null исключение, когда мое кодирование выполняется

Это означает, что вы вызывая исключение без сообщения. Если вы печатаете исключение и где оно произошло (или пусть JVM сделает это за вас), вы увидите, где.

Чтобы определить, почему это происходит, я предлагаю выполнить код в вашем отладчике, чтобы вы могли понять, что делает каждая строка.

0

Основной метод формы, который вы вставляете, обычно является точкой входа программы и не вызывается другим кодом Java. Таким образом, хорошая практика - поймать и обработать все Исключения, прежде чем покинуть вашу программу.

«Ручка» может означать разные вещи:

  1. Просто распечатайте сообщение исключения на консоль, как и вы (в этом случае вы теряете информацию, как Питер Lawrey уже указывал).
  2. Распечатайте stacktrace (e.printStackStrace()), который выводит дополнительную информацию об исключении на выходе stderr. Это то, что делает java, если метод main() остается с неперехваченным исключением.
  3. Если вы используете фреймворк loglog: регистраторы и его Appenders могут печатать всю информацию об исключениях в выбранном вами месте.
  4. Обращайтесь к нему (1-3) и выйдите из java с кодом выхода! = 0, чтобы (программный) вызывающий объект вашего приложения смог обработать ситуацию с ошибкой.

BTW1: Я даже поймаю Throwable. Таким образом, вы также можете улавливать возможные неконтролируемые исключения (NullPointerException, ArrayIndexOutOfBoundsException и т. Д.).И поместите попробовать в самом начале (если вы сделаете ошибку при доступе к вашему ARGS массива вы покрыли также ArrayIndexOutOfBoundsException)

BTW2: Если бы не есть какие-либо try..catch в основном методе, который я предположим, что код даже не компилируется, потому что компилятор может обнаружить, что могут быть необработанные проверенные исключения (из ваших операций ввода-вывода).

+0

Да, мой код будет компилироваться только с помощью try/catch или put 'throw IOException' в основном методе. Мне просто интересно, что из этого кода вызывает исключения, является ли тот факт, что я использую «BufferedReader» или манипулирую файлами? Мне никогда не приходилось использовать это раньше. –

+0

Каждый входной или выходной поток формально объявляет проверенные IOExceptions (или деривации) по его основным методам. Поскольку концепция очень широкая, поток может считывать почти все, что представляет собой простую последовательность байтов: файлы, массивы байтов, строки сокетов и т. Д. Во время операций на этих ресурсах может произойти много сбоев, которые сигнализируются через исключение. – Heri

+0

Читатели и писатели - это всего лишь тонкие обертки вокруг другого потока. О читателях и писателях вы работаете со строками (последовательностями символов), тогда как в потоках вы работаете с чистым байтом или байтом. Поэтому - при работе с Readers and Writers - важно использовать признак используемого набора символов (чтобы определить перевод байтового массива в символы) – Heri