Не могли бы вы помочь мне понять, где я должен делать исключения и ловить их. Пожалуйста, посмотрите мой код. Я думал, что в классе Thrd я уже бросил и поймал исключение. Но когда я писал в основном классе FirstThread.readFile("ParallelProgramming.txt"), я столкнулся с ошибкой во время выполнения - необработанным исключением. Поэтому мне пришлось использовать try и catch. Итак, я почему-то не понимаю, почему в классе Thd мои попытки и блокировки блокировки не работают.
package parallelprogramming;
import java.lang.Thread;
import java.io.*;
public class Thrd extends Thread {
public void readFile(String File) throws FileNotFoundException {
FileReader fr = new FileReader(File);
BufferedReader br = new BufferedReader(fr);
String s;
try {
while ((s = br.readLine()) != null) {
System.out.println(s);
}
fr.close();
}
catch (FileNotFoundException FNFD) {
System.out.println("File not found!");
}
catch (IOException IOE){
System.out.println("IOException caught!");
}
}
}
package parallelprogramming;
import java.io.FileNotFoundException;
public class ParallelProgramming {
public static void main(String[] args) throws FileNotFoundException {
Thrd FirstThread = new Thrd();
try {
FirstThread.readFile("ParallelProgramming.txt");
} catch (FileNotFoundException FNFD) {
System.out.println("File not found!");
}
}
}
Правила с проверенными исключениями (и это включает в себя исключение IOException
, которое FileNotFoundException
является дочерним для):
throws
его;catch
его; обратите внимание, что даже в этом случае вы можете восстановить это исключение;main()
выбрасывает любое исключение, и этот триггер исключает, программа завершается.Теперь предположим, что вы используете Java 7. В этом случае сделайте следующее:
public void readFile(final String file)
throws IOException
{
final Path path = Paths.get(file);
for (final String line: Files.readAllLines(path, StandardCharsets.UTF_8))
System.out.println(line);
}
Зачем беспокоиться? ;)
Если вы не хотите этого делать, но читайте строки за строкой, тогда:
public void readFile(final String file)
throws IOException
{
final Path path = Paths.get(file);
try (
final BufferedReader reader = Files.newBufferedReader(path,
StandardCharsets.UTF_8);
) {
String line;
while ((line = reader.readLine()) != null)
System.out.println(line);
}
}
Вторая форма предпочтительнее, если вы хотите конкретно относиться к исключениям. Обратите внимание, что с Java 7, у вас есть значимые исключения относительно того, почему вы не можете получить доступ к файлу против IOException
: NoSuchFileException
, AccessDeniedException
, и т.д. и т.п. Все эти наследуют FileSystemException
. Старый API файлов не может сделать это для вас.
Это означает, что если вы хотите справиться с ошибками уровня файловой системы, вы можете:
catch (FileSystemException e) { /* ... */ }
где раньше вы это делали:
catch (FileNotFoundException e) { /* ... */ }
Переведенный выше код, если вы хотите поймать исключения, вы выполните следующее:
// All exceptions handled within the method -- except if you rethrow it
public void readFile(final String file)
{
final Path path = Paths.get(file);
try (
final BufferedReader reader = Files.newBufferedReader(path,
StandardCharsets.UTF_8);
) {
String line;
while ((line = reader.readLine()) != null)
System.out.println(line);
} catch (FileSystemException e) {
// deal with a filesystem-level error
// Note that you MUSt catch it before IOException
// since FileSystemException inherits IOException
} catch (IOException e) {
// deal with a low-level I/O error
}
}
Есть два способа справиться с исключением, которое вам нужно поймать или выбросить снова. В методе readFile вы сделали оба. вы поймали исключения с помощью блоков catch, тогда вы упоминали, что метод readFile вызывает FileNotFoundException, поэтому, когда вы используете метод readFile, вам нужно снова поймать исключение.
Удалите ' throws FileNotFoundException ' из метода readFile
класса Thrd
тогда вам не нужно обрабатывать это исключение в основном методе класса ParallelProgramming
.
Когда вы выкинете FileNotFoundException из метода readFile, тогда исключение перейдет к методу, который будет вызван этим, то есть основной метод должен обрабатывать это исключение.