Попробуйте и поймать блоки: будь то в самом классе или когда я вызываю метод вне класса

1

Не могли бы вы помочь мне понять, где я должен делать исключения и ловить их. Пожалуйста, посмотрите мой код. Я думал, что в классе 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!");
        }
    }
}
Теги:

3 ответа

1
Лучший ответ

Правила с проверенными исключениями (и это включает в себя исключение 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
    }
}
0

Есть два способа справиться с исключением, которое вам нужно поймать или выбросить снова. В методе readFile вы сделали оба. вы поймали исключения с помощью блоков catch, тогда вы упоминали, что метод readFile вызывает FileNotFoundException, поэтому, когда вы используете метод readFile, вам нужно снова поймать исключение.

  • 0
    Ну, я должен немного переварить это.
0

Удалите ' throws FileNotFoundException ' из метода readFile класса Thrd тогда вам не нужно обрабатывать это исключение в основном методе класса ParallelProgramming.

Когда вы выкинете FileNotFoundException из метода readFile, тогда исключение перейдет к методу, который будет вызван этим, то есть основной метод должен обрабатывать это исключение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню