请教大虾Java多重构造函数的问题

时间:2021-08-19 19:25:27
小弟写Java遇到一个比较麻烦的问题,想问问各位高手,就是如何创建多重的构造函数
写了一个够着函数用来初始化我类里面的各个成员变量,然后又写了些其他的构造函数,目的是用来处理用户输入时候缺少参数的情况。然后我用this去调用,但编译器提示说要把this放在构造函数的前面~请教大侠如何处理,我不想重写一堆代码呢~~~

public class Relation {

private BasicComponent header;
private BasicComponent[] body; 
private int nSize;

    public Relation( BasicComponent udt_header ) {
     this( udt_header, 0 );
    }
    
    public Relation() {
     BasicComponent udt_header = new BasicComponent();
     this( udt_header, 0 );//编译器就是这个地方提示的错误~~~~有谁有好方法??
    }

    public Relation( BasicComponent udt_header, int n_nSize ) {
     BasicComponent udt_tempHeader = new BasicComponent();
     int nTempSize = 0;
     if( udt_header != null && 
     !udt_header.getName().isEmpty() &&
     !udt_header.getElement(0).isEmpty() )
     udt_tempHeader = udt_header;
     if( n_nSize > 0 )
     nTempSize = n_nSize;
     header = udt_tempHeader;
     if( nTempSize > 0 )
     body = new BasicComponent[ nTempSize ];
     nSize = nTempSize; 
    }
    
//***************************************************************************   
后面省略~~~麻烦知道的大侠告诉下~~~~~感激不尽!!!!

8 个解决方案

#1


call to this must be first statement in constructor 这个就是JAVA报错的东西~~~~~~~~~~~~~~~~~~~求救~~~~~~~

#2


this()必须放在方法主体中的第一行。

#3


顶二楼

#4


必须放在第一行么???那么如果要避免赋值的是个null的话,是不是意味着我需要在最下面的那个构造函数里面把这个为空的情况给处理掉,而不能在那个报错的那一行的位置处理?
另外顺便问一下,各位在设计Java程序的时候,是如何处理值传递过程中的NullPointerException的???因为我的最后的调试中总会出现这个异常~~~

#5


这样写构造函数,太笨了。
为啥不这样写呢?
public Relation() { 
    this.header=new BasicComponent();
    this.body=new BasicComponent[1];//这个1只是举个例子,你可以改成你想要的值
     nSize=0;
     //很奇怪,为啥都要去搞个临时变量,为啥不直接赋值,就象我前面写的那样?
    } 

    public Relation( BasicComponent udt_header, int n_nSize ) { 
        this();//注意,这里先初始化
         BasicComponent udt_tempHeader = new BasicComponent(); 
        int nTempSize = 0; 
        if( udt_header != null && 
           !udt_header.getName().isEmpty() && 
            !udt_header.getElement(0).isEmpty() ) 
                udt_tempHeader = udt_header; 
            if( n_nSize > 0 ) 
                 nTempSize = n_nSize; 
             header = udt_tempHeader; 
            if( nTempSize > 0 ) 
                 body = new BasicComponent[ nTempSize ]; 
            nSize = nTempSize; 

    } 
    

#6


NullPointerException就是空指针异常,意思就是说,对象引用为null,无法调用方法。解决方法就是获得一个对象实例,最简单的办法就是new一个对象。

#7


5楼的大侠,说的很有道理啊~!我之前那样做事因为以前写的代码总出了NullPointerException所有不得已而那样写的~~~~~多谢多谢!!

#8


构造器最大用途之一就是初始化数据成员,而不要试图让它做更多的事情。
这样既分工明确,条理清晰又可以使代码之间的关联不高度联系,纠错时也容易。
不介意的话,我把你的构造器修改了一下。其余用途的实现你应该放到其余方法中。这只是我的建议。

public class Relation 
{      
    public Relation() 
    {      
    this(null,0);  //这里如果不想给第一个参数具体值的话,可以为null.
    } 
    public Relation(BasicComponent udt_header )
    { 
     this( udt_header, 0 );   //初始化第一个参数,第二个给个初值即可。
    }   
    public Relation( BasicComponent udt_header, int n_nSize )
    { 
    header = udt_header;
    nSize = n_nSize;
    }
    
    private BasicComponent header; 
  private BasicComponent[] body; 
  private int nSize; 


#1


call to this must be first statement in constructor 这个就是JAVA报错的东西~~~~~~~~~~~~~~~~~~~求救~~~~~~~

#2


this()必须放在方法主体中的第一行。

#3


顶二楼

#4


必须放在第一行么???那么如果要避免赋值的是个null的话,是不是意味着我需要在最下面的那个构造函数里面把这个为空的情况给处理掉,而不能在那个报错的那一行的位置处理?
另外顺便问一下,各位在设计Java程序的时候,是如何处理值传递过程中的NullPointerException的???因为我的最后的调试中总会出现这个异常~~~

#5


这样写构造函数,太笨了。
为啥不这样写呢?
public Relation() { 
    this.header=new BasicComponent();
    this.body=new BasicComponent[1];//这个1只是举个例子,你可以改成你想要的值
     nSize=0;
     //很奇怪,为啥都要去搞个临时变量,为啥不直接赋值,就象我前面写的那样?
    } 

    public Relation( BasicComponent udt_header, int n_nSize ) { 
        this();//注意,这里先初始化
         BasicComponent udt_tempHeader = new BasicComponent(); 
        int nTempSize = 0; 
        if( udt_header != null && 
           !udt_header.getName().isEmpty() && 
            !udt_header.getElement(0).isEmpty() ) 
                udt_tempHeader = udt_header; 
            if( n_nSize > 0 ) 
                 nTempSize = n_nSize; 
             header = udt_tempHeader; 
            if( nTempSize > 0 ) 
                 body = new BasicComponent[ nTempSize ]; 
            nSize = nTempSize; 

    } 
    

#6


NullPointerException就是空指针异常,意思就是说,对象引用为null,无法调用方法。解决方法就是获得一个对象实例,最简单的办法就是new一个对象。

#7


5楼的大侠,说的很有道理啊~!我之前那样做事因为以前写的代码总出了NullPointerException所有不得已而那样写的~~~~~多谢多谢!!

#8


构造器最大用途之一就是初始化数据成员,而不要试图让它做更多的事情。
这样既分工明确,条理清晰又可以使代码之间的关联不高度联系,纠错时也容易。
不介意的话,我把你的构造器修改了一下。其余用途的实现你应该放到其余方法中。这只是我的建议。

public class Relation 
{      
    public Relation() 
    {      
    this(null,0);  //这里如果不想给第一个参数具体值的话,可以为null.
    } 
    public Relation(BasicComponent udt_header )
    { 
     this( udt_header, 0 );   //初始化第一个参数,第二个给个初值即可。
    }   
    public Relation( BasicComponent udt_header, int n_nSize )
    { 
    header = udt_header;
    nSize = n_nSize;
    }
    
    private BasicComponent header; 
  private BasicComponent[] body; 
  private int nSize;