Возвращает список массивов в виде сообщения в пользовательском исключении в JAVA

#java #exception #try-catch #throws

Вопрос:

Мне нужно вывести a List<String> , когда возникает исключение. Я хочу, чтобы программа остановила свое выполнение, как только возникнет исключение. Чтобы прояснить ситуацию, в моем коде есть эти две функции:

        List<String> exceptions = new ArrayList<>();
    
        public Boolean validation(Obj obj){
           if(condition1){ exceptions.add("exception1");}
           if(condition2){ exceptions.add("exception2");}
              .
              .
              .
           if(exceptions.size() > 0) return false;
           else return true;
        }
    
        public Obj getValidResponse(Obj obj){
           if(validation(obj)){ return obj;}
           else{ throw new CustomException(exceptions);}  //on this line, the program should return the List<String> of all the exceptions stored. 
        }
 

Всякий раз, когда я создаю исключение, список печатается после сообщения о техническом исключении, которое мне не нужно.
Кроме того, я не могу найти способ возврата с помощью getMessage() функции, реализованной в моем CustomException, в инструкции throw, поскольку она выдает Expected throwable type ошибку.

Мой пользовательский класс исключений выглядит так :

 public class CustomException extends RuntimeException{
    public CustomException(List<String> s) {
        super(String.valueOf(s));
    }
}
 

Я довольно новичок в этом, любая помощь была бы очень признательна. 🙂

Комментарии:

1. Привет, я не уверен, правильно ли я это понял или нет, но похоже, что вы хотите показывать пользователю несколько сообщений об ошибках при возникновении исключения, т. Е. Список всех возможных сообщений о неудачной проверке. В этом случае вы можете создать пользовательский объект, который ваше исключение возвращает при возникновении исключения. И в этом объекте у вас может быть список сообщений об ошибках.

2. Да. что я точно хочу, так это; всякий раз, когда функция»проверка» возвращает значение false, она должна выдавать исключение, которое будет выглядеть как [«исключение 1», «исключение 3», «Исключение X»…]. и программа завершится. По поводу вашего предложения, как я должен создать пользовательский объект? не могли бы вы подробнее рассказать об этом? Спасибо

3. Класс исключений должен расширять вызываемое исключение, обычно исключение или исключение времени выполнения, которым, по-видимому, не является ваш класс пользовательских исключений. Пожалуйста, обновите свой вопрос кодом для класса CustomException.

4. Привет @whbogado, я добавил свое пользовательское исключение. Проблема в том, что я все еще получаю результат, подобный — Exception в пользовательском исключении потока «main»: [«исключение 1», «исключение 2»,….]. есть ли способ избежать этого и просто вернуть список?

Ответ №1:

Вы можете сделать это, выделив подкласс из исключения RuntimeException (используйте собственное имя и поля, чтобы исключение было самоописательным).:

 public class CustomException extends RuntimeException {

    private List<String> myStrings;

    public CustomException(List<String> s) {
        this.myString = s;
    }

    public List<String> getMyStrings() {
        return myStrings;
    }

    public String getMessage() {
        return String.join(",", myStrings);
    }
}
 

Java может только бросать Throwables , никаких других объектов. Это отличается от других языков программирования. И getMessage метод, который используется для строкового представления, всегда возвращает a String . Когда вам нужно другое поведение, возвращающее реальный список, вы должны использовать свой собственный перехватчик
/ барьер неисправности считывает список строк напрямую и применяет правильную обработку.

Можете ли вы быть более точным, когда вам нужен список строк как List<String> . Похоже, вы используете какой-то код обработчика, который интересует не только строковое сообщение об исключении. В вашем коде кажется, что вы пытаетесь вернуть an Obj . Ваша идея заключается в том, чтобы вместо этого вернуть список ошибок, если он не сработает? Это не работает таким образом. Если вы что-то бросите, это вызовет исключение, и ничего не будет возвращено. Это другой программный поток. Если вы хотите вернуть список ошибок, вы также можете создать специальную

 public class StatusResult {

    private boolean error;
    
    private Obj sucessObj;
   
    private List<String> errorMsgs;

// add constructor and getters here ...
}
 

Но такой вид обработки успеха / ошибок не похож на Java.

Комментарии:

1. спасибо @k_o_ , но как я должен использовать getMyStrings() функцию в throw инструкции? Если я использую just throw new CustomException(exceptions) , он возвращает что — то вроде этого Exception in thread "main" CustomException:["exc1", "exc4"] -чего я не хочу.

2. Exception in thread ... звучит как автоматическое сообщение трассировки стека, созданное Java. Я предполагал, что вы где-то улавливаете исключения и обрабатываете их для вызова getMyStrings . При печати трассировки стека или передаче исключения регистратору Java использует этот getMessage метод. Конструктор, который я использовал, просто присоединяется к переданному списку, это то, что используется getMessage . Вы также можете напрямую переопределить getMessage , чтобы получить лучший формат. В Java могут быть выброшены только выбрасываемые файлы, это отличается от других языков программирования.

3. Смотрите мой обновленный ответ. Я предполагаю, что ваша цель еще не ясна.

Ответ №2:

Ну вот одно из решений для такого пользовательского класса исключений:

 public class CustomException extends Exception{

    private final List<String> errors;

    public CustomException(List<String> errors) {
        this.errors = errors;
    }

    @Override
    public String getMessage() {

        String msg = errors.stream()
                .collect(Collectors.joining(", ", "[", "]"));

        return msg;
    }

}
 

Вы можете использовать его следующим образом:

 public static void main(String[] args) {

    try {
        errorFunc();
    } catch (CustomException exception) {
        System.out.println(exception.getMessage());
    }
}

public static void errorFunc() throws  CustomException {

    List<String> errors = new ArrayList<>();
    errors.add("error#1");
    errors.add("error#2");
    errors.add("error#3");

    throw new CustomException(errors);
}
 

Выход:

 [error#1, error#2, error#3]
 

Но, пожалуйста, обратите внимание, что это не очень хорошая практика в целом. Исключение должно представлять собой одну ошибку, а не несколько. Обычно вы создаете базовый класс, который представляет собой специальную «категорию» ваших исключений. Тогда у конкретных ошибок может быть свое собственное исключение, которое является производным от этого базового исключения. Одним из примеров является FileNotFoundExcpetion (https://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html), который является производным от исключения IOException (которое, в свою очередь, является производным от класса исключений).

Выдача строки с несколькими ошибками может указывать на то, что ваша функция выполняет несколько действий (и эти действия могут пойти не так).

Комментарии:

1. Я действительно не понимаю, почему этот ответ был отклонен, он дает правильный результат. Да, он использует проверенное исключение, которое можно критиковать, однако использование непроверенного исключения не будет работать лучше из-за того, как Java выводит исключения. В каждом случае вам придется использовать блок try/catch и посмотреть: Непроверенные исключения — Противоречие .

Ответ №3:

 import java.util.ArrayList;
import java.util.List;
public class CustomException extends Exception{
    private List<String> exceptions;
    public CustomException(List<String> exp) {
        this.exceptions = exp;
    }   
    public List<String> getExceptions(){
        return exceptions;
    }
    public static void main(String[] args) {
    
        try {
            boolean result = getValidResponse();
        }catch(CustomException e) {
            List<String> msgs = e.getExceptions();
            for(String ss:msgs) {
                System.out.println(ss);
            }
        }
    }   
    static List<String> exps = new ArrayList<String>(); 
    public static boolean validation(boolean error){
        boolean result = false;
        if(error) {         
            exps.add("Error msg 1");
            exps.add("Error msg 2");            
        }else{
            result =  true;
        }        
        return resu<
    }   
    public static boolean getValidResponse() throws CustomException{
        boolean r = false;
        validation(true);
        if(exps.size()>0) {
            throw new CustomException(exps);
        }
        return r;
    }
}