NullPointerException при создании нового экземпляра JAXBContext в Java - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть класс, который будет выводить мои объекты в XML и наоборот.Мой метод для этого использует JAXB, с try / catch.

Когда я запускаю программу, я получаю сообщение об ошибке:

New Drawing object could not me instaned.Exception in thread "main" java.lang.NullPointerException
at se.miun.vife1700.dt062g.jpaint.FileHandler.saveToXML(FileHandler.java:21)
at se.miun.vife1700.dt062g.jpaint.Main.testDrawing(Main.java:53)
at se.miun.vife1700.dt062g.jpaint.Main.main(Main.java:21)

Кажется, что мне нужно написать JAXBContext context =ноль;перед попыткой поймать.Но как мне сделать это по-другому?Когда я разыграю исключение, программа не продолжит выполняться?Я новичок в JAVA и особенно исключения.

Любая помощь приветствуется.

    import javax.xml.bind.*;
import java.io.File;
import java.util.Objects;


public class FileHandler {

    public static void saveToXML (Drawing drawing, String fileName) {

        JAXBContext context = null;
        try {
            context = JAXBContext.newInstance(Drawing.class);
        } catch (JAXBException e) {
            System.err.print("New Drawing object could not be instanced.");
        }
        Marshaller marshaller = null;
        try {
            marshaller = context.createMarshaller();
        } catch (JAXBException e) {
            System.err.print("Could not create a Marshaller");
        }

        try {
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        } catch (PropertyException e) {
            System.err.print("A problem occurred when setting output format");
        }

        if(Objects.equals(".xml", fileName.substring(fileName.length() - 4))) {

            try {
                marshaller.marshal(drawing, new File(fileName));
            } catch (JAXBException e) {
                System.err.print("An error occurred when saving to file.");
            }
        }
        else {

            fileName += ".xml";
            try {
                marshaller.marshal(drawing, new File(fileName));
            } catch (JAXBException e) {
                System.err.print("An error occurred when saving to file.");
            }
        }

    }


    public static Drawing loadFromXML(String fileName){

        Drawing drawing = null;
        JAXBContext context = null;
        try {
            context = JAXBContext.newInstance(Drawing.class);
        } catch (JAXBException e) {
            System.err.print("New Drawing object could not be instanced.");
        }
        Unmarshaller unmarshaller = null;
        try {
            unmarshaller = context.createUnmarshaller();
        } catch (JAXBException e) {
            System.err.print("Could not create a Unmarshaller");
        }

        try {
            drawing = (Drawing) unmarshaller.unmarshal(
                    new File(fileName)
            );
        } catch (JAXBException e) {
            System.err.print("An error occurred when loading from file.");
        }

        return drawing;
    }


}

Заранее спасибо.

1 Ответ

0 голосов
/ 08 декабря 2018

Ваш способ не имеет смысла.Подумайте об этом:

    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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...