Ваш способ не имеет смысла.Подумайте об этом:
JAXBContext context = null;
try {
context = JAXBContext.newInstance(Drawing.class);
} catch (JAXBException e) {
System.err.print("New Drawing object could not be instanced.");
}
Если при попытке создать контекст возникает исключение JAXBException, тогда контекст сохраняет свое первоначальное значение: null.Так что же произойдет при выполнении следующей строки?
Marshaller marshaller = null;
try {
marshaller = context.createMarshaller();
} catch (JAXBException e) {
System.err.print("Could not create a Marshaller");
}
Это гарантировано для выброса исключения NullPointerException.Попытка использовать контекст, который не может быть создан, и делать вид, что исключение не было брошено, не имеет смысла.Кроме того, это на самом деле стреляет себе в ногу, так как вместо того, чтобы иметь фактическое сообщение об ошибке и трассировку стека в консоли, точно сообщая вам, что не так, у вас есть только смутное «Не удалось создать маршаллера», что делает егоневозможно понять, почему маршаллер не может быть создан.
Этот метод не должен перехватывать исключения, потому что он не может обрабатывать их правильно.Надо просто их размножать.Или, по крайней мере, если вы хотите изолировать вызывающего абонента от кровавых XML-подробностей, вам следует перебросить пользовательское (или другое стандартное) исключение:
try {
// all the code here
}
catch (JAXBException e) {
throw new FileHandlingException("Error while saving file", e);
}
Это намного лучше, потому что вызывающий теперь знает, чтофайл не может быть сохранен и может действовать соответствующим образом (например, останавливая программу или спрашивая пользователя, что он хотел бы сделать), вместо того, чтобы продолжать и действовать, как будто ничего плохого не произошло.