Это не проблема с блоками try / catch как таковыми. Проблема связана с областью видимости переменной, и вам необходимо иметь блок try / catch из-за проверенного исключения и, следовательно, установить новую область видимости.
У вас также есть другая опция - объявите отмеченное исключение (я) как throws
из вашего метода.
public static void main(String[] args) throws IOException {
// ...code here...
}
Это совершенно законно для main
метода.
Если вы хотите обработать исключение, как в большой программе. Вы можете определить конкретную попытку / отловить проблемный блок кода и использовать переменную вне области видимости, объявив переменную вне этой области, как многие ответили:
FileReader fr = null; // must be initialized here if the exception handling code
// does not exit the method
try {
fr = new FileReader(fileName);
} catch (IOException ex) {
// log, print, and/or return
// if you return or exit here then subsequent code can assume that fr is valid
}
Вы также можете поместить код перемещения в другой метод, который работает с исключением:
private static FileReader openReader(String fileName) {
try {
return new FileReader(fileName);
} catch (IOException ex) {
// log/print exception
return null; // caller must then expect a null
// or
throw new RuntimeException(...); // throw a RuntimeException of some kind (may not be good practice either)
}
}
Вы также можете переместить код обработки файла в другой метод. Это может быть лучше и позволит вам более правильно следовать принципам открытия / закрытия в окончательной идиоме:
FileReader fr = null;
try {
fr = new FileReader(fileName);
Scanner input = new Scanner(fr);
processInput(input);
} catch (IOException ex) {
// log/print exception
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException ex) {
// empty
}
}
}
private static void processInput(Scanner in) throws IOException {
// ...processing here
}
Для закрытой части вы можете использовать стороннюю библиотеку (Apache File Utils) или написать простой метод для обеспечения статического безопасного метода закрытия, который не вызывает исключений.
Вам действительно стоит взглянуть на разбиение больших методов на более мелкие единицы, и это часто даст вам гораздо более четкий способ обработки исключений.