#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
инструкции? Если я использую justthrow 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;
}
}