2014-12-08 2 views
1

Я обрабатываю в первый раз Исключения на Java, и я хочу знать, если это будет хорошим способом.Добавить подписи подписи во всех методах

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


    static void submethod() throws FileNotFoundException { 
     Scanner scan = new Scanner(new File("file.txt")); 

     while (scan.hasNextLine()) { 
      // do somethig... 
     } 
    } 

То, что звучит странно для меня это явное объявление throws FileNotFoundException и в методе main, иначе компилятор сообщает:

error: unreported exception FileNotFoundException; must be caught or declared to be thrown 

Я хотел бы знать, если я делаю это неправильно. В более сложном проекте, где вам нужно поймать гораздо больше исключений, это станет очень грязным. Это лучшая практика для обработки исключений? И почему мне нужно объявить об этом в обоих методах?

+0

Вам нужно объявить об этом в обоих методах, потому что оба метода могут выбрасывать это исключение. Вы правы, однако, что это может вызвать раздутие подписи метода. Продолжается дискуссия по вопросу о проверенных и непроверенных Исключениях, которые происходят в течение некоторого времени. – azurefrog

+0

'throws' в вашем' submethod() 'означает, чтобы вызывающий блок знал, что существует исключение, которое не было обнаружено. В вашем методе 'main()' вам необходимо окружить вызов 'submethod()' в блоке 'try-catch'. 'throws' на вашем' main() 'методе почти никогда не бывает хорошей идеей (возможно, просто никогда). –

+0

@DrewKennedy Спасибо за подсказку. Этот способ звучал неправильно и для меня. – fillobotto

ответ

2

Задание FileNotFoundException в предложении throws необходимо, поскольку FileNotFoundException является проверенным исключением. Другой вариант - поймать исключение и обработать его с помощью try-catch.

Это зависит от ваших требований к программе, чтобы решить, как справиться с этим исключением. Например, если вы хотите напечатать определенное сообщение об ошибке, когда исключение, вы можете поймать его:

try { 
    Scanner scan = new Scanner(new File("file.txt")); 

    while (scan.hasNextLine()) { 
     // do somethig... 
    } 
} catch(FileNotFoundException ex) { 
    System.err.println("file.txt was not found"); 
} 

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

В более сложных сценариях вы можете захотеть поймать исключение, распечатать что-то пользователю и продолжить программу. Например, если submethod используется только для чтения файла, предоставленного пользователем, то вы можете сохранить throws как есть. Однако вызывающий метод может захотеть обработать исключение в случае его броска и, возможно, попросить пользователя повторно ввести другое имя файла.

+0

Лучший ответ, так как также дает больший обзор проблемы. Тем не менее, я пойду с try-catch, потому что я привык к этому из-за прошлого опыта C#. – fillobotto

0

Вы не должны обращаться с этим так. Вы должны где-то ловить ошибку и обрабатывать исключение. Вы должны либо поймать ошибку в submethod(), либо поймать ее в основном методе и обработать исключение. То, как у вас есть это прямо сейчас, нет обработки ошибок, просто бросая ошибку в стек. Пример:

static void submethod() { 
    try 
    { 
     Scanner scan = new Scanner(new File("file.txt")); 

     while (scan.hasNextLine()) { 
      // do somethig... 
     } 
    }catch(FileNotFoundException e) 
    { 
     e.printStackTrace(); 
     //error handling here 
    } 
} 

Или:

public static void main(String[] args) { 
    try 
    { 
     submethod(); 
    }catch(FileNotFoundException e) 
    { 
     e.printStackTrace(); 
     //error handling code here 
    }   
} 

Во втором случае вы бы бросить FileNotFoundException в вашем submethod(), то есть. вы оставите объявление бросков в своем подтеме, но не ваш основной метод, с которым вы бы справились.

0

Поскольку ваш метод submethod() не обрабатывает исключение FileNotFoundExceptionm. Вызывающий метод должен обрабатывать это исключение, которое может быть выполнено путем включения вызова метода в блок try catch или путем добавления бросков к вашему основному методу.

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