[英]NullPointerException when creating new JAXBContext instance in Java
[英]IndexOutOfBoundsException when creating instance of JAXBContext
所以這個程序應該編組我創建的 object。 我創建了一個 object 並為其擁有的每個屬性賦予價值,目的是使用其數據生成 a.xml。 為此,我必須創建一個 JAXBContext 實例,在其中我指定 object 的 class。 這就是我得到 IndexOutOfBoundsException 的地方:
"JAXBContext jc = JAXBContext.newInstance(HealthTopic.class);"
當我到達上面提到的那條線時,我得到了
Output 來自 ActividadXML3
```Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.addProperty(ClassInfoImpl.java:885)
at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.findFieldProperties(ClassInfoImpl.java:393)
at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.getProperties(ClassInfoImpl.java:296)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.getProperties(RuntimeClassInfoImpl.java:171)
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:246)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:88)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:212)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:83)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.addAllSubtypes(ReferencePropertyInfoImpl.java:332)
at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.calcTypes(ReferencePropertyInfoImpl.java:158)
at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.getElements(ReferencePropertyInfoImpl.java:107)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeReferencePropertyInfoImpl.getElements(RuntimeReferencePropertyInfoImpl.java:56)
at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.ref(ReferencePropertyInfoImpl.java:98)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeReferencePropertyInfoImpl.ref(RuntimeReferencePropertyInfoImpl.java:60)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeReferencePropertyInfoImpl.ref(RuntimeReferencePropertyInfoImpl.java:40)
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:260)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:88)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:212)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:83)
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:360)
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:375)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:439)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:462)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at actividadxml3.ActividadXML3.main(ActividadXML3.java:139)
C:\Users\aitor\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)```
在這一點上,我在搜索文檔和論壇后被困在這里兩天沒有任何進展,所以當我們找不到答案並且我們感到不知所措時,我確實像我們所有人一樣:打開一個堆棧溢出問題以被社區燒毀.
這是我的程序的主要 class ,我在其中創建 object 並填充其所有屬性以希望在此工作時生成.xml
ActividadXML3.java
package actividadxml3;
import java.io.File;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
/**
*
* @author Smock
*/
public class ActividadXML3 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try{
//crear y poblar objeto
HealthTopic ht = new HealthTopic();
//atributos HealthTopic
ht.setMetaDesc("Un ataque cerebral hemorrágico ocurre cuando un vaso sanguíneo se rompe y sangra en el cerebro. Entérese sobre síntomas, diagnóstico y tratamientos ");
ht.setTitle("Accidente cerebrovascular hemorrágico");
ht.setUrl("https://medlineplus.gov/spanish/hemorrhagicstroke.html");
ht.setId(6264);
ht.setLanguage("Spanish");
ht.setDateCreated("08/26/2015");
//elementos valorados dentro de HealthTopic
ArrayList<String> alsoCalled = new ArrayList<String>();
alsoCalled.add("Accidente cerebral hemorrágico");
alsoCalled.add("Ataque cerebral hemorrágico");
alsoCalled.add("Derrame cerebral hemorrágico");
ht.setAlsoCalled(alsoCalled);
ht.setFullSummary("https://medlineplus.gov/spanish/stroke.html");
//GROUP
Group gp = new Group();
gp.setUrlGroup("https://medlineplus.gov/spanish/bloodheartandcirculation.html");
gp.setIdGroup(7);
gp.setValor("Sangre, corazón y circulación");
ht.addObject(gp);
Group gp2 = new Group();
gp2.setUrlGroup("https://medlineplus.gov/spanish/brainandnerves.html");
gp2.setIdGroup(14);
gp2.setValor("Cerebro y nervios");
ht.addObject(gp2);
//LANGUAGE-MAPPED-TOPIC
LanguageMappedTopic lmt = new LanguageMappedTopic();
lmt.setUrlLanguage("https://medlineplus.gov/hemorrhagicstroke.html");
lmt.setIdLanguage(6263);
lmt.setLanguage("English");
lmt.setValorLanguage("Hemorrhagic Stroke");
ht.addObject(lmt);
//PRIMARY-INSTITUTE
PrimaryInstitute pi = new PrimaryInstitute();
pi.setUrlInstitute("https://medlineplus.gov/spanish/nihinstitutes.html#NINDS");
pi.setValor("Instituto Nacional de Trastornos Neurológicos y Accidentes Cerebrovasculares");
ht.addObject(pi);
//SITES
Site s1 = new Site();
s1.setTitle("Alta tras accidente cerebrovascular");
s1.setUrl("https://medlineplus.gov/spanish/ency/patientinstructions/000132.htm");
s1.setLanguageMappedUrl("https://medlineplus.gov/ency/patientinstructions/000132.htm");
ArrayList<String>info1 = new ArrayList<String>();
info1.add("Mas informacion");
info1.add("Spanish/Español");
info1.add("NON_DISPLAY (Patient Handout");
s1.setInformationCategory(info1);
s1.setOrganization("Enciclopedia Médica");
ht.addObject(s1);
Site s2 = new Site();
s2.setTitle("Angiopatia amiloide cerebral");
s2.setUrl("https://medlineplus.gov/spanish/ency/article/000719.htm");
s2.setLanguageMappedUrl("https://medlineplus.gov/ency/article/000719.htm");
ArrayList<String>info2 = new ArrayList<String>();
info2.add("Mas informacion");
info2.add("Spanish/Español");
s2.setInformationCategory(info2);
s2.setOrganization("Enciclopedia Médica");
ht.addObject(s2);
Site s3 = new Site();
s3.setTitle("Hablemos sobre el ataque hemorrágico al cerebro");
s3.setUrl("https://www.stroke.org/-/media/stroke-files/spanish-resources/ltas-hemorrhagic-stroke.pdf");
s3.setLanguageMappedUrl("https://www.stroke.org/en/about-stroke/types-of-stroke/hemorrhagic-strokes-bleeds");
ArrayList<String>info3 = new ArrayList<String>();
info3.add("Mas informacion");
info3.add("Spanish/Español");
s3.setInformationCategory(info3);
s3.setOrganization("Asociación Americana del Corazón");
s3.setStandardDescription("PDF");
ht.addObject(s3);
Site s4 = new Site();
s4.setTitle("Hemorragia subaracnoidea");
s4.setUrl("https://medlineplus.gov/spanish/ency/article/000701.htm");
s4.setLanguageMappedUrl("https://medlineplus.gov/ency/article/000701.htm");
ArrayList<String>info4 = new ArrayList<String>();
info4.add("Mas informacion");
info4.add("Spanish/Español");
s4.setInformationCategory(info4);
s4.setOrganization("Enciclopedia Médica");
ht.addObject(s4);
Site s5 = new Site();
s5.setTitle("Prevención de un accidente cerebrovascular");
s5.setUrl("https://medlineplus.gov/spanish/ency/patientinstructions/000678.htm");
s5.setLanguageMappedUrl("https://medlineplus.gov/ency/patientinstructions/000678.htm");
ArrayList<String>info5 = new ArrayList<String>();
info5.add("Mas informacion");
info5.add("Spanish/Español");
info5.add("NON-DISPLAY (Patient Handout)");
s5.setInformationCategory(info5);
s5.setOrganization("Enciclopedia Médica");
ht.addObject(s5);
//System.out.println(ht.toString());
//Error en jaxbConext indexOutofBoundsException en l asiguiente linea
System.out.println("Inicio creacion objeto JAXB");
JAXBContext jc = JAXBContext.newInstance(HealthTopic.class);
System.out.println("Ojala algun dia lea esto en pantalla");
Marshaller mar = jc.createMarshaller();
mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
File xml = new File("health-topic.xml");
mar.marshal(ht, xml);
}catch(JAXBException ex){
System.out.println(ex);
System.out.println(ex.getMessage());
}
}
}
我很確定您將需要我的 HealthTopic.class 來幫助我,我認為您不需要子類的 rest 但如果您這樣做,請告訴我,我會很樂意編輯並發布它們。
健康主題.class
package actividadxml3;
import java.util.ArrayList;
import javax.xml.bind.annotation.*;
/**
*
* @author Smock
*/
@XmlRootElement(name="health-topic")
@XmlAccessorType(XmlAccessType.FIELD)//todos los campos son automaticamente generados
public class HealthTopic {
@XmlAttribute(name = "meta-desc")
private String metaDesc;
@XmlAttribute(name = "title")
private String title;
@XmlAttribute(name = "url")
private String url;
@XmlAttribute(name = "id")
private int id;
@XmlAttribute(name = "language")
private String language;
@XmlAttribute(name = "date-created")
private String dateCreated;
@XmlElement(name = "also-called")
private ArrayList<String> alsoCalled;
//@XmlMixed
@XmlElement(name="full-summary")
private String fullSummary;
@XmlMixed
@XmlElementRefs({
@XmlElementRef(type = Group.class),
@XmlElementRef(type = LanguageMappedTopic.class),
@XmlElementRef(type = PrimaryInstitute.class),
@XmlElementRef(type = Site.class)
})
private ArrayList<Object> objects = new ArrayList();
public HealthTopic() {
}
public HealthTopic(String metaDesc, String title, String url, int id, String language, String dateCreated, ArrayList<String> alsoCalled, String fullSummary, ArrayList<Object> objects) {
this.metaDesc = metaDesc;
this.title = title;
this.url = url;
this.id = id;
this.language = language;
this.dateCreated = dateCreated;
this.alsoCalled = alsoCalled;
this.fullSummary = fullSummary;
this.objects = objects;
}
public String getMetaDesc() {
return metaDesc;
}
public void setMetaDesc(String metaDesc) {
this.metaDesc = metaDesc;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getDateCreated() {
return dateCreated;
}
public void setDateCreated(String dateCreated) {
this.dateCreated = dateCreated;
}
public ArrayList<String> getAlsoCalled() {
return alsoCalled;
}
public void setAlsoCalled(ArrayList<String> alsoCalled) {
this.alsoCalled = alsoCalled;
}
public String getFullSummary() {
return fullSummary;
}
public void setFullSummary(String fullSummary) {
this.fullSummary = fullSummary;
}
public ArrayList<Object> getObjects() {
return objects;
}
public void setObjects(ArrayList<Object> objects) {
this.objects = objects;
}
public void addObject(Object object){
objects.add(object);
}
@Override
public String toString() {
return "HealthTopic{" + "metaDesc=" + metaDesc + ", title=" + title + ", url=" + url + ", id=" + id + ", language=" + language + ", dateCreated=" + dateCreated + ", alsoCalled=" + alsoCalled + ", fullSummary=" + fullSummary + ", objects=" + objects + '}';
}
}
如果有人能夠找到解決方案或為我指明正確的方向,這對我來說意義重大,因為我已經在這方面浪費了太多時間而沒有進展,如果沒有解決問題,我會感覺很糟糕。
編輯:添加類的 rest 因為它可能會有所幫助
組.java
package actividadxml3;
import javax.xml.bind.annotation.*;
/**
*
* @author Smock
*/
@XmlRootElement(name="group")
@XmlAccessorType(XmlAccessType.PROPERTY)//todos los getters/setter se generan automaticamente
public class Group {
private String urlGroup;
private int idGroup;
//implementar valor del group
private String valor;
public Group() {
}
public Group(String urlGroup, int idGroup, String valor) {
this.urlGroup = urlGroup;
this.idGroup = idGroup;
this.valor = valor;
}
public String getUrlGroup() {
return urlGroup;
}
@XmlAttribute(name="url")
public void setUrlGroup(String urlGroup) {
this.urlGroup = urlGroup;
}
public int getIdGroup() {
return idGroup;
}
@XmlAttribute(name="id")
public void setIdGroup(int idGroup) {
this.idGroup = idGroup;
}
public String getValor() {
return valor;
}
//no hace falta anotaciones prueba
public void setValor(String valor) {
this.valor = valor;
}
@Override
public String toString() {
return "Group{" + "urlGroup=" + urlGroup + ", idGroup=" + idGroup + ", valor=" + valor + '}';
}
}
LanguageMappedTopic.java
package actividadxml3;
import javax.xml.bind.annotation.*;
/**
*
* @author Smock
*/
@XmlRootElement(name="language-mapped-topic")
@XmlAccessorType(XmlAccessType.NONE) // nada se genera a no ser que se anote
public class LanguageMappedTopic {
@XmlAttribute(name="url")
private String urlLanguage;
@XmlAttribute(name="id")
private int idLanguage;
@XmlAttribute(name="language")
private String language;
@XmlValue
private String valorLanguage;
public LanguageMappedTopic() {
}
public LanguageMappedTopic(String urlLanguage, int idLanguage, String language, String valorLanguage) {
this.urlLanguage = urlLanguage;
this.idLanguage = idLanguage;
this.language = language;
this.valorLanguage = valorLanguage;
}
public String getUrlLanguage() {
return urlLanguage;
}
public void setUrlLanguage(String urlLanguage) {
this.urlLanguage = urlLanguage;
}
public int getIdLanguage() {
return idLanguage;
}
public void setIdLanguage(int idLanguage) {
this.idLanguage = idLanguage;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getValorLanguage() {
return valorLanguage;
}
public void setValorLanguage(String valorLanguage) {
this.valorLanguage = valorLanguage;
}
@Override
public String toString() {
return "LanguageMappedTopic{" + "urlLanguage=" + urlLanguage + ", idLanguage=" + idLanguage + ", language=" + language + ", valorLanguage=" + valorLanguage + '}';
}
}
PrimaryInstitute.java
package actividadxml3;
import javax.xml.bind.annotation.*;
/**
*
* @author Smock
*/
@XmlRootElement(name="primary-institute")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)//se genera todo lo declarado publico
public class PrimaryInstitute {
private String urlInstitute;
private String valor;
public PrimaryInstitute() {
}
public PrimaryInstitute(String urlInstitute, String valor) {
this.urlInstitute = urlInstitute;
this.valor = valor;
}
public String getUrlInstitute() {
return urlInstitute;
}
@XmlAttribute(name="url")
public void setUrlInstitute(String urlInstitute) {
this.urlInstitute = urlInstitute;
}
public String getValor() {
return valor;
}
@XmlValue
public void setValor(String valor) {
this.valor = valor;
}
@Override
public String toString() {
return "PrimaryInstitute{" + "urlInstitute=" + urlInstitute + ", valor=" + valor + '}';
}
}
** Site.class**
package actividadxml3;
import java.util.ArrayList;
import javax.xml.bind.annotation.*;
/**
*
* @author Smock
*/
@XmlRootElement(name="site")
public class Site {
@XmlAttribute(name="title")
private String title;
@XmlAttribute(name="url")
private String url;
@XmlAttribute(name="language-mapped-url")
private String languageMappedUrl;
@XmlMixed
@XmlElement(name="information-category")
private ArrayList<String> informationCategory;
@XmlElement(name="organization")
private String organization;
@XmlElement(name="standard-description",required=false)
private String standardDescription;
public Site() {
}
public Site(String title, String url, String languageMappedUrl, ArrayList<String> informationCategory, String organization, String standardDescription) {
this.title = title;
this.url = url;
this.languageMappedUrl = languageMappedUrl;
this.informationCategory = informationCategory;
this.organization = organization;
this.standardDescription = standardDescription;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getLanguageMappedUrl() {
return languageMappedUrl;
}
public void setLanguageMappedUrl(String languageMappedUrl) {
this.languageMappedUrl = languageMappedUrl;
}
public ArrayList<String> getInformationCategory() {
if(informationCategory == null){
informationCategory = new ArrayList<>();
}
return informationCategory;
}
public void setInformationCategory(ArrayList<String> informationCategory) {
this.informationCategory = informationCategory;
}
public String getOrganization() {
return organization;
}
public void setOrganization(String organization) {
this.organization = organization;
}
public String getStandardDescription() {
return standardDescription;
}
public void setStandardDescription(String standardDescription) {
this.standardDescription = standardDescription;
}
@Override
public String toString() {
return "Site{" + "title=" + title + ", url=" + url + ", languageMappedUrl=" + languageMappedUrl + ", informationCategory=" + informationCategory + ", organization=" + organization + ", standardDescription=" + standardDescription + '}';
}
}
這應該是全部。 正如有人所說,我嘗試修改 ArrayLists 的 getter,以防它們是 null,以便我返回新創建的 ArrayList,但我仍然遇到相同的錯誤。
我認為我的程序沒有更多代碼可以顯示,但如果我錯了請告訴我。
在 HealthTopic class 中,更改列表的吸氣劑。 如果列表是 null 然后創建 object 然后只返回如下列表(更改所有列表):
public ArrayList<String> getAlsoCalled() {
if (alsoCalled == null) {
alsoCalled = new ArrayList<>();
}
return alsoCalled;
}
問題出在您的站點 class 中,請對您的站點class 進行以下更改
添加
@XmlAccessorType(XmlAccessType.FIELD)
刪除 informationCategory 變量的 @XmlMixed 注釋
// @XmlMixed @XmlElement(name="information-category") private ArrayList<String> informationCategory;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.