ERP_By_WeiDong 2010-04-24 16:47
浏览 220
已采纳

Java编译能通过,但是运行的时候提示有错误

Java编译能通过,但是运行的时候提示有错误。

提示出现这样的错误:

 

Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.idea.ok.Person.main(Person.java:32)
Caused by: java.lang.NullPointerException
    at org.idea.ok.Gender1.<init>(Gender1.java:28)
    at org.idea.ok.Gender1.<clinit>(Gender1.java:17)
    ... 1 more

 原程序如下:

package org.idea.ok;

/*
 *枚举类
 *既可以通过public访问权限的静态常量来访问实例;
 *也可以通过Gender1类的getInstance静态方法来访问实例变量。 
 */
 
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.NoSuchElementException;
import java.util.Map;
import java.util.HashMap;
 
public class Gender1 implements Serializable {
    public static final Gender1 FEMALE = new Gender1(new Character('F'), "FEMALE");
    public static final Gender1 MALE = new Gender1(new Character('M'), "MALE");
    private final Character sex;
    private final transient String description;
    private static Map<Character, Gender1> instancesBySex = 
        new HashMap<Character, Gender1>();

    
    private Gender1(Character sex, String description) {
        this.sex = sex;
        this.description = description;
        instancesBySex.put(sex, this);
    }
    
    public Character getSex() {
        return sex;
    }
    
    public String getDescription() {
        return description;
    }
    
    public static Collection getAllValues() {
        return Collections.unmodifiableCollection(instancesBySex.values());
    }
    
    public static Gender1 getInstance(Character sex) {
        
        /*按照参数指定的性别缩写查找Gender1实例*/
        Gender1 result = (Gender1)instancesBySex.get(sex);
        if (result == null) {
            throw new NoSuchElementException(sex.toString());
        }
        return result;
    }
    
    public String toString() {
        return description;
    }
    
    private Object readResolve() {
        
        /*保证反序列化时直接返回Gender1类包含的静态实例*/
        return getInstance(sex);
    }
}
package org.idea.ok;

/*
 */
 
public class Person {
    private String name;
    private Gender1 gender;
    
    public Person(String name, Gender1 gender) {
        this.name = name;
        this.gender = gender;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public Gender1 getGender() {
        return gender;
    }
    
    public void setGender(Gender1 gender) {
        this.gender = gender;
    }
    
    public static void main(String[] args) {
        Person mary = new Person("Mary", Gender1.FEMALE);
        System.out.println("name = " + mary.getName() + "\t" + "gender = " + mary.getGender());
    }
}

 程序异常提示是:初始化的时候错误;但是造成这种异常的根源是Gender1中的代码的问题。这个我还真是找不出来了,麻烦谁能找出来的,小弟不胜感谢。

  • 写回答

1条回答 默认 最新

  • y7997883 2010-04-24 18:10
    关注

    private static Map instancesBySex =

    new HashMap();

    放到Gender1的开头就可以了,

    是加载顺序的问题,当运行到
    Person mary = new Person("Mary", Gender1.FEMALE);

    这行时,系统加载Gender1类,当加载到
    public static final Gender1 FEMALE = new Gender1(new Character('F'), "FEMALE");
    这行时,由于还没有初始化instancesBySex ,此时instancesBySex 为null,而上面用到了instancesBySex 的put方法,出现空指针。

    使用调试模式,一步一步执行,查看对象的属性就可以发现问题所在了。

    自认为instancesBySex 没有必要存在,
    public static Collection getAllValues() {

    return Collections.unmodifiableCollection(instancesBySex.values());

    }

    public static Gender1 getInstance(Character sex) {   
    
        /*按照参数指定的性别缩写查找Gender1实例*/   
        Gender1 result = (Gender1)instancesBySex.get(sex);   
        if (result == null) {   
            throw new NoSuchElementException(sex.toString());   
        }   
        return result;   
    }   
    

    可修改为
    public static Gender1[] getAllValues() {
    return new Gender1[]{Gender1.FEMALE,Gender1.MALE};
    }
    public static Gender1 getInstance(Character sex) {

        if(set.equals(new Character("F")) {
             return Gender1.FEMALE;
        } else {
             return Gender1.MALE;
        }
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 MATLAB APP 制作出现问题
  • ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
  • ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)
  • ¥15 DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI[/untitled30_war_e
  • ¥15 使用deepspeed训练,发现想要训练的参数没有梯度
  • ¥15 寻找一块做为智能割草机的驱动板(标签-stm32|关键词-m3)
  • ¥15 信息管理系统的查找和排序
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),怎么用读取的电磁传感器信号表示小车所在的位置
  • ¥15 如何解决y_true和y_predict数据类型不匹配的问题(相关搜索:机器学习)
  • ¥15 PB中矩阵文本型数据的总计问题。