题目很简单,就是输出1—500之内的所有“完数”和他们的因子,所谓完数就是一个数=各个因子之和。可能我的程序写得有点太过于“向面向对象靠拢”的模式化,毕竟以前我都是接触面向过程的,所以想培养一下面向对象的思想:)高手不要见笑啊!
这个算法我的程序肯定没有问题,编译也通过了,但是运行的时候出现了错误提示:Exception in thread "main" java.lang.NullPointerException at CompletedNumberTest.IsCompletedNumber at CompletedNumber.main,这是问什么呢?这是什么错误?
程序清单如下:
public class CompletedNumber{
  public static void main(String[ ] args){
    System.out.print("1—500之内的完数   因子");
    for(int i=1; i<=500; i++){
      CompletedNumberTest numObj=new CompletedNumberTest();
      numObj.IsCompletedNumber(i);
    }      
  }
}class CompletedNumberTest{
  private static int[] arrOfFactors;
  
  public void IsCompletedNumber(int number){
    int countOfFactors=0, numOfFactors=0;
    for(int i=1; i<=number/2; i++){
      if (number%i==0){
        countOfFactors+=i;
        arrOfFactors[numOfFactors]=i;
        numOfFactors++;       
      }
    }
    if (number==countOfFactors){
      System.out.print('\n'+number+':');
      for(int i=0; i<numOfFactors; i++)
        System.out.print(arrOfFactors[i]+' ');
    }  
  }}

解决方案 »

  1.   

    private static int[] arrOfFactors = new int[500];数组未初始化
      

  2.   

    private static int[] arrOfFactors这个数组没有实例化,运行到arrOfFactors[numOfFactors]=i时会抛出NullPointerException。你没有比要生成500个CompletedNumberTest对象,这是非常耗时和耗内存的操作。我觉得也没有必要用Inner class。class是用来重构的,你那样写就体现不出来。就像你每天要吃三顿饭一样,你是一个人吃,而不是要变出来3个人来吃。class CompletedNumberTest{
      //这个方法里面写你的业务
      public void IsCompletedNumber(int number){}
      //生成一个对象,然或调用上面的算法
      public static void main(String[ ] args){}  
    }
      

  3.   

    //换成这个试试
    //我不懂算法,只是改了你的程序/*输出1—500之内的所有“完数”和他们的因子,所谓完数就是一个数=各个因子之和。*/
    public class CompletedNumber {
        private static final int NUMBER = 500;
        public static void main(String[] args) {
            System.out.println("1—500之内的完数   因子");
            CompletedNumberTest numObj = new CompletedNumberTest(NUMBER);
            for (int i = 1; i <= NUMBER; i++) {
                numObj.IsCompletedNumber(i);
            }
        }
    }/**
     * 
     * 作者: Loon
     * 时间: 2005-9-24
     * 
     * 工程: eprj-test
     * 位置: 
     *//**
     * 判断是否是一个完数,并输出结果
     */
    class CompletedNumberTest {    private int[] arrOfFactors;
        CompletedNumberTest(int number){
            arrOfFactors = new int[number];
        }    public void IsCompletedNumber(int number) {
            int countOfFactors = 0, numOfFactors = 0;
            for (int i = 1; i <= number / 2; i++) {
                if (number % i == 0) {
                    countOfFactors += i;
                    arrOfFactors[numOfFactors] = i;
                    numOfFactors++;
                }
            }
            if (number == countOfFactors) {
                System.out.print(number + ":");
                for (int i = 0; i < numOfFactors -1; i++)
                    System.out.print(arrOfFactors[i] + ",");
                System.out.println(arrOfFactors[numOfFactors - 1]);
            }
        }}
      

  4.   

    private static int[] arrOfFactors;//错了,老兄
      

  5.   

    我改了,能运行了,但是结果不太对,请大家帮我再看看,我看了好半天了也看不出来……
    public class CompletedNumber{
      private static final int COUNT=100;
      public static void main(String[ ] args){
        System.out.println ("1—500之内的完数   因子");
        CompletedNumberTest numObj = new CompletedNumberTest(COUNT);
        for(int i=1; i<=500; i++)
          numObj.IsCompletedNumber(i);      
      }
    }class CompletedNumberTest{
      private static int[] arrOfFactors;
      
      CompletedNumberTest(int count){
        arrOfFactors = new int[count];
      }
      
      public void IsCompletedNumber(int number){
        int countOfFactors=0, numOfFactors=0;
        for(int j=1; j<=number/2; j++){
          if (number%j==0){
            countOfFactors+=j;
            arrOfFactors[numOfFactors]=j;
            numOfFactors++;       
          }
        }
        if (number==countOfFactors){
          System.out.println(number+": ");
          for(int i=0; i<numOfFactors; i++)
            System.out.print(arrOfFactors[i]+',');
        }  
      }}