2017-02-18 6 views
-2

Я пытаюсь открыть и прочитать файл, переданный из командной строки.разница между system.err.println и просто выбрасывание исключения? (java)

Это то, что я до сих пор:

import java.io.*; 

public class Test { 

    public static void main(String[] args) throws FileNotFoundException { 

     if ((args[0].length() == 0) || (args[0] == null) || (args[0].isEmpty())) { 
      System.err.println("Usage Error: No file name was provided."); 
      System.exit(1); 
     } 

     File file = new File(args[0]); 

     if (!file.exists()) { 
      System.err.println("Usage Error: The file, " + args[0] + ", does not exist."); 
     } 

     if (!file.canRead()) { 
      System.err.println("Usage Error: The file, " + args[0] + ", cannot be read."); 
     } 
    } // main 
} 

Я не совсем уверен, как я должен быть обработка файла не найдены исключения. Мой учитель упомянул блоки try/catch, но я не был уверен, нужны ли мне те, кто здесь. Достаточно ли просто проверить, был ли файл передан как аргумент, и если он не использовал метод System.err.print(), чтобы дать пользователю ошибку?

Кроме того, если вызывается System.err.print(), то это выходит из программы после этого (что означает, мне нужно включить System.exit (1) после этого)? Или лучше (в плане дизайна), чтобы просто сделать что-то вроде этого:

public void readFile() throws FileNotFoundException { 
    // try to open file here 
} 

public static void main(String[] args) { 
    try { 
     readFile(); 
    } catch (Exception e) { 
     // exception handled here 
    } 
} 

Мне просто нужно, чтобы убедиться, что пользователь фактически передает строку в качестве имени файла и что она существует/может быть прочитан.

+0

Разница в том, что они не совпадают. Один выводит вывод на консоль. Другой изменяет поток программы. Все это документировано. Нет необходимости гадать. – EJP

ответ

0

Исключения облегчают работу с ошибками программным способом.

Смысл: когда ваша программа состоит только из основной функции и вы хотите сообщить пользователю, что «файл не существует»; то это не делает слишком большой разницы, если ваша программа печатает разумное сообщение для stderr; и затем существует с некоторым ненулевым кодом возврата; или если вы выбрали исключение.

Напротив; в вашем простом примере; имея точное сообщение об ошибке на самом деле должно быть предпочтительнее, чем бросать исключение и иметь JVM-печать (потенциально запутанная) трассировка стека для пользователя.

Но: ваша текущая программа - всего лишь небольшая примерная вещь. Как только ситуация становится больше, ваша программа состоит из вызовов многих разных классов в разных компонентах. И тогда печать на stderr уже не является хорошей идеей. Затем вы хотите убедиться, что один слой, который сталкивается с проблемой, имеет определенный способ сообщить об этой ситуации; и это то, для чего предназначены исключения. В таких ситуациях вы очень предпочитаете исключения; потому что некоторый более высокий уровень может их поймать, а затем решить, что делать. Например, программа может решить показать сообщение об ошибке на некоторой панели пользовательского интерфейса; или отправить сообщение в файл журнала; или отправить текстовое сообщение на какой-либо мобильный телефон. Все это было бы почти невозможно, если бы вы только печатали на stderr.

0

В catch вместо // exception handled here вы можете написать любой код, который хотите. Если вы просто бросаете исключение - java сама выполняет некоторые стандартные вещи.

0

Не спешите и прочитайте книгу «Эффективная Java (2-е издание)» Джошуа Блох. Пункт 57 (Используйте исключения только для исключительных условий) в главе Исключения будут разъяснять все в этой теме.

Смежные вопросы