Ответ 1
Я полагаю, вы могли бы создать исключение, содержащее список исключенных исключений и выкинуть это исключение, например:
class AggregateException extends Exception {
List<Exception> basket;
}
Есть ли способ выбросить несколько исключений из java?
Я полагаю, вы могли бы создать исключение, содержащее список исключенных исключений и выкинуть это исключение, например:
class AggregateException extends Exception {
List<Exception> basket;
}
Нет, есть no way, вы можете сделать что-то вроде:
try {
throw new IllegalArgumentException(), new NullPointerException();
} catch (IllegalArgumentException iae) {
// ...
} catch (NullPointerException npe) {
// ...
}
если это то, о чем вы просите.
Вы могли использовать конструктор причин, чтобы сделать следующее:
try {
throw new IllegalArgumentException(new NullPointerException());
} catch (IllegalArgumentException iae) {
// handle illegal argument...
throw iae.getCause(); // throws the cause (the NullPointerException)
}
Метод может вызывать одно из нескольких исключений. Например:
public void dosomething() throws IOException, AWTException {
// ....
}
Это означает, что метод может в конечном итоге отбросить один из этих двух исключений (а также любое из исключенных исключений). Вы cannnot (в Java или на любом языке AFAIK) бросают одновременно два исключения, что не имеет большого смысла.
Вы также можете выкинуть вложенное Exception, которое содержит внутри другого объекта исключения. Но это вряд ли будет считать это "бросанием двух исключений", оно просто представляет собой один случай исключения, описанный двумя объектами исключений (часто из разных слоев).
Бросок более одного исключения не имеет смысла, потому что у вас не может быть больше одной ошибки (ошибка может иметь несколько причин, но в любой момент не может быть больше одной ошибки).
Если вам нужно отслеживать причины, вы можете связать исключения:
} catch (Exception ex) {
throw new RuntimeException("Exc while trying ...", ex);
}
Они доступны через getCause()
.
Я видел шаблон, в котором пользовательское исключение хранит другие исключения (не помнит, почему они это сделали), но это было похоже:
public class ContainerException extends Exception {
private List<Exception> innerExeptions = new Arrayist<Exception>();
// some constructors
public void add(Exception e) {
innerExceptions.add(e);
}
public Collection<Exception> getExceptions() {
return innerExceptions;
}
}
и он использовался следующим образом:
try {
// something
} catch (ContainerException ce) {
ce.add(new RunTimeException("some Message");
throw ce; // or do something else
}
Позже в коде исключение контейнера было оценено и сброшено в файл журнала.
У вас может быть возможность бросить несколько разных исключений. Например:
if (obj == null)
throw new NullPointerException();
if (some other case)
throw new IllegalArgumentException();
if (this == this)
throw new IOException();
Этот код может вызывать несколько разных исключений, но это никогда не может произойти в одно и то же время.
Шаблон, описанный Andreas_D, определенно полезен, когда вы обрабатываете, скажем, компиляцию на стороне сервера предоставленного пользователем файла и хотите сообщить об ошибках.
Например, у вас может быть исключение CompilationException, которое генерируется, если ресурс не скомпилируется. Компиляция может означать любое количество вещей. Например, вы можете оценить текст внутри файла, который загружает конечный пользователь, анализировать токены, проверять наличие синтаксических ошибок и определять, является ли файл действительным. В конце, вещь является либо действительной, либо недействительной, и вы хотите передать правильное исключение CompilationException для распространения резервной копии стека вызовов.
Как описывает Andreas, у вас может быть метод add(), который позволяет добавлять проблемы компиляции в ваше исключение. Эти проблемы не обязательно должны быть Исключениями, но это зависит от вас. Это часто помогает придерживаться единой инфраструктуры исключений, поэтому вы можете использовать одну и ту же логику проверки в нескольких местах.
Во всяком случае, вы хотите, чтобы одно исключение CompilationException возвращалось через стек вызовов, потому что это говорит о том, что эта вещь не компилируется. Если кто-то из цепочки хочет знать, почему, тогда они могут получить основные проблемы с вызовом, скажем, getCauses().
Это также полезно с точки зрения пользовательского интерфейса. Эта информация, зависящая от Exception, может быть правильно обработана, прежде чем возвращаться по проводу, чтобы вы могли предоставить конечному пользователю некоторую информацию о том, почему компиляция не удалась.
Чтобы выбросить несколько исключений в Java, вам сначала придется подавлять каждое исключение в одно настраиваемое исключение, а затем бросать одно и то же настраиваемое исключение. Пожалуйста, проверьте приведенный ниже фрагмент кода, чтобы достичь того же.
public class AggregateException extends Exception {
public void addException(Exception ex){
addSuppressed(ex);
exception = true;
}
}
public class AnyClass{
public AggregateException aggExcep = new AggregateException();
public void whereExceptionOccurs(){
try{
//some code
}catch(Exception e){
aggExcep.addException(e);
//throw aggExcep;
}
}
}
Вызвать метод addException с той же ссылкой aggExcep, где вы хотите (внутри блока catch явно), подавляет любое исключение. И в конце явно бросайте aggExcep, используя ключевое слово "throw", где бы вы ни захотели.
void addSuppressed (Throwable exception)
- это предопределенный метод класса Throwable, который добавляет указанное исключение к исключениям, которые были подавлены для доставки этого исключения.
существует способ для метода бросить несколько исключений, но не в одно время. например при сбое компиляции по какой-то причине ваш метод может вызывать только одно исключение. если вам нужно рассмотреть различные возможности, вы можете объявить вам метод бросить родительский класс обо всех исключениях "Исключение". поэтому, если вы объявляете метод генерации исключения в целом, этот метод может быть вызван исключением любого типа.
например:
public static void main(String[] args) throws Exception
{
getClipboard(); // throws an UnsupportedFlavorException
initIOActivity(); // throw an IOException
}
Я не знаю, что вам действительно нужно знать, но, возможно, это помогает. хотя прошло много времени с момента вашего сообщения ^^
привет
Я не уверен, что вы спрашиваете, может ли быть выбрано несколько исключений за раз, или у нас может быть код для обработки нескольких исключений за раз. Я постараюсь ответить на оба этих вопроса. Это мой первый ответ на StackOverflow, поэтому прошу прощения за любые ошибки.
1) Если вы хотите бросить несколько исключений за раз, я думаю, вы не сможете этого сделать. Рассмотрим аналогичную ситуацию. Когда вы решаете математические вопросы и достигаете точки, в которой вы делите на 0, в ЭТОЙ ТОЧКЕ времени есть только одна ошибка, и это деление на ноль. Поэтому я думаю, вы можете просто выбросить одну ошибку для данного оператора. Однако в вашем блоке catch try может существовать множество операторов, каждый из которых может вызвать различную ошибку.
2) Если вы хотите обрабатывать/улавливать несколько ошибок, есть два способа сделать это. i) Перед Java 7:
`try{
...
//some method/action that can be a cause of multiple errors,say X and Y
...
}catch(XException e){
//Do something if exception X arises.
}catch(YException e){
//Do something if exception Y arises.
}
`
ii) После Java 7 у вас есть функция многопользовательского доступа.
try{
...
//some method/action that can be a cause of multiple errors,say X and Y
...
}catch(XException|YException e){
// Take action appropriate to both types of exception.
...
}
Я верю, что это решит ваши сомнения. Это мой первый ответ, все предложения приветствуются!