Как создать свое собственное исключение с помощью предварительно написанного метода на Java? - PullRequest
1 голос
/ 02 октября 2019

Я написал свое исключение, но не могу его выбросить.

Приложение по-прежнему завершает работу и выдает стандартное сообщение об ошибке:

Exception in thread "main" java.nio.file.NoSuchFileException: H:\db_sort\pdfs\test_5_database
at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at sun.nio.fs.WindowsFileCopy.move(Unknown Source)
at sun.nio.fs.WindowsFileSystemProvider.move(Unknown Source)
at java.nio.file.Files.move(Unknown Source)
at ExceptionTest.filemove(ExceptionTest.java:22)
at ExceptionTest.main(ExceptionTest.java:9)

Приложение должно переместить некоторые файлы, но может быть так, что файл, который необходимо переместить, не существует. Затем программа просто распечатает, что файл не может быть перемещен, и затем программа перейдет к следующему файлу.

Вот фрагмент моего кода, в котором я хочу выбросить исключение. Файл test_5_database не существует. Затем он просто распечатает:

Файл был переименован, перемещен или удален, и эти изменения не синхронизированы с базой данных.

Вот мой код (я не публикую весь свой код, Я просто опубликую свою проблему исключения):

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ExceptionTest {

  public static void main(String[] args) throws IOException {
      try {
          filemove();

          System.out.println("The file has been moved!");
      }
       catch(NoSuchFileException e) {
           System.out.println(e.getMessage());
           e.printStackTrace();
       }


 }

 private static void filemove() throws IOException, NoSuchFileException{
    Files.move(Paths.get("H:/db_sort/pdfs/test_5_database"),Paths.get("H:/db_sort/pdf s/2019-08/test_5_database"));
 }

}

class NoSuchFileException extends Exception{
    NoSuchFileException(){
        super("The file has been moved, renamed or deleted and those changes 
               are not synchronized with the database");
    }
}

Я надеюсь, что кто-то может помочь мне и объяснить, как я могу выдать свое собственное сообщение об ошибке. После отображения сообщения об ошибке приложение продолжит перемещение файлов.

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

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

Метод Files.move(...) выдает NoSuchFileException, который приходит из пакета java.nio.file.

Ваша реализация NoSuchFileException может иметь то же имя, но никогда не выбрасывается. Таким образом, вы должны catch java.nio.file.NoSuchFileException и бросить свои my.package.NoSuchFileException.

Но, может быть, лучше (во избежание путаницы) переименовать ваше Исключение, например, FileNotSynchronizedException. Вы можете сделать это следующим образом:

Первый вариант (вы можете удалить импорт для NoSuchFileException)

private static void filemove() throws IOException, NoSuchFileException{
     try{
        Files.move( Paths.get("H:/db_sort/pdfs/test_5_database"),Paths.get("H:/db_sort/pdf s/2019-08/test_5_database"));
     }catch(java.nio.file.NoSuchFileException e){
         throw new my.package.NoSuchFileException();
     }
}

Второй вариант

private static void filemove() throws IOException, FileNotSynchronizedException{
     try{
        Files.move( Paths.get("H:/db_sort/pdfs/test_5_database"),Paths.get("H:/db_sort/pdf s/2019-08/test_5_database"));
     }catch(NoSuchFileException e){
         throw new my.package.FileNotSynchronizedException();
     }
}

См. Другое предложение throws в заголовке метода? Вы просто изменили исключение, бросив свое собственное.

ИМХО второй вариант лучше, вы бы избежали конфликтов с существующими исключениями из java.nio.files, и это дает вам возможность сделать более конкретные исключения. Например, если вы также хотите перехватить IOException и создать свой собственный, просто добавьте еще одно предложение catch.

0 голосов
/ 02 октября 2019
You can throw a custom exception like below, hope my understanding is correct.

package test;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ExceptionTest {

  public static void main(String[] args) throws NoSuchFileException {
      try {
          filemove();

          System.out.println("The file has been moved!");
      }
       catch(IOException e) {
           throw new NoSuchFileException();
       }


 }

 private static void filemove() throws IOException{
        Files.move(Paths.get("H:/db_sort/pdfs/test_5_database"),Paths.get("H:/db_sort/pdf s/2019-08/test_5_database"));
 }

}

class NoSuchFileException extends Exception{
    NoSuchFileException(){
        super("The file has been moved, renamed or deleted and those changes are not synchronized with the database");
    }
}

Output : 
Exception in thread "main" test.NoSuchFileException: The file has been moved, renamed or deleted and those changes are not synchronized with the database
    at test.ExceptionTest.main(ExceptionTest.java:15)
0 голосов
/ 02 октября 2019

Если вы создаете новое исключение, дайте ему имя, отличное от существующего.

Чтобы выдать исключение, вы должны написать:

throw new ExceptionName("message");

, например:

throw new UnsupportedOperationException();

Если вы хотите выдать исключение, когда файл не существует:

if(checkIfFileExists) {
    throw new ExceptionName("message");
}

перед выполнением операции.

В вашем случае лучшим подходом является изменение catch (создание нового исключения не требуется вэтот случай), например:

   catch(NoSuchFileException e) {
       System.out.println("The file has been moved, renamed or deleted and those 
       changes are not synchronized with the database");
       System.out.println(e.getMessage());
       e.printStackTrace();
   }
...