這是一個關(guān)于復(fù)數(shù)的小程序,運(yùn)行表示由字符串構(gòu)造復(fù)制對象這個構(gòu)造函數(shù)出現(xiàn)問題,求幫忙,運(yùn)行提示的錯誤如下: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -2 ?at java.lang.String.substring(Unknown Source) ?at 異常處理20121107.Complex2.<init>(Complex2.java:31) ?at 異常處理20121107.Complex2.main(Complex2.java:100)
程序如下:
package 異常處理20121107;
public class Complex2 implements Comparable1
{
?public double real,imag;
?public Complex2(double real,double imag) ?
{ ??
this.real=real; ??
this.imag =imag; ?
}
?public Complex2()
?{ ??
this(0,0);
?} ?
public Complex2(Complex2 d)
?{
??this.real =d.real ; ?
?this.imag =d.imag ; ?
}
?public Complex2(String s) ?
{ ?
?int i,n;
??n=0; ?
?String d1,d2;
??for(i=0;i!='\0';i++)??
???? { ??
???? ?n++; ??
??? ?if(s.charAt(i)=='+') ??
??????? ??break; ?
????? }
??d1=s.substring(0, i-1); ?
?d2=s.substring(i,n-1); ?
?this.real =Double.parseDouble(d1);
??this.imag =Double.parseDouble(d2);
?}
?public String toString()
?{ ??
???? String d1,d2,d3;
??? ??d1=String.valueOf(this.real);
???? ??d2=String.valueOf(this.imag);
????? ???d3=d1+'+'+d2; ??
???? ???return d3; ?
? ?}
?public double getModel()
?{ ??return Math.sqrt(real*real+imag*imag); ?}
?public void add(Complex2 c)
?{???
???this.real+=c.real;
??this.imag+=c.imag; ?
}
?public static Complex2 add(Complex2 c1,Complex2 c2)
?{ ??
Complex2 c3=null;
??c3.real=c1.real+c2.real;
??c3.imag=c1.imag+c2.imag;??
?? return c3;
?}
?public void subtract(Complex2 c) ?{???
??this.real-=c.real; ?
?this.imag-=c.imag;
?}
?public static Complex2 subtract(Complex2 c1,Complex2 c2)
?{ ??
Complex2 c3=null; ?
?c3.real=c1.real-c2.real;
??c3.imag=c1.imag-c2.imag;??
return c3; ?
}
?public boolean equals(Complex2 c) ?
{ ??
?????? if(real==c.real&&imag==c.imag) ?
???? ??return true;
???? ??else ?
?? ???? return false; ?
}
?public boolean Comparable1(Complex2 c)
?{ ?
????? if((this.real*this.real+this.imag*this.imag-c.imag*c.imag-c.real*c.real)>0) ???????? ?return true; ?
???? ?else ??
???????? ?return false; ?
}
?public static void main(String args[]) ?
{ ?
?Complex2 c1=new Complex2(12.3,3.4); ?
?Complex2 c2=new Complex2(3.8,3.6); ?
?Complex2 c3=new Complex2(72.5,10.4); ??
Complex2 c4=new Complex2(12.3,3.4); ?
Complex2 c5=new Complex2("12+5i"); ?
?String s; ? ??
System.out.println(c1.real+"+"+c1.imag+"i");
??System.out.println(c2.real+"+"+c2.imag+"i"); ?
?System.out.println(c3.real+"+"+c3.imag+"i"); ??
System.out.println(c4.real+"+"+c4.imag+"i"); ??
??System.out.println(c5.real+"+"+c5.imag+"i"); ??
??s=c1.toString(); ?
?System.out.println(s);
??System.out.println(c2.getModel());
??c3.add(c4); ?
?System.out.println(c3.real+"+"+c3.imag+"i"); ?
?if(c1.equals(c4)) ?
??System.out.println("c1>c4"); ?
?else ???
System.out.println("c1<c4"); ??
?if(c2.Comparable1(c3)) ??
?System.out.println("c2的模大于c3的模"); ?
?else ??
?System.out.println("c2的模小于c3的模");
?}
}
7 回答

SMILET
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個贊
我剛才驗(yàn)證過了,是d1=s.substring(0, i-1)的參數(shù)i-1可能會得到一個負(fù)數(shù)的值,因?yàn)槟闱懊媸褂玫膕.charAt(i)返回的i的值可能是0,而substring(int beginIndex,int endIndex)這個方法返回的是一個字串,改字串以索引為beginIndex的字符開始直到索引為endIndex的字符結(jié)束(包含索引為beginIndex的字符,不包含索引為endIndex的字符),你出錯的地方正是在對這兩個知識點(diǎn)的理解上。我看了你的題目真心沒看懂你要做什么,所以也不好給你改代碼以符合你的題目要求,你可以根據(jù)你的題目的要求做一些變動去解決上述兩個問題。下述編譯結(jié)果只是我強(qiáng)制用if語句限定執(zhí)行條件后得到的一個結(jié)果:

手掌心
TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個贊
樓主是用C、C++的?
for(i=0;i!='\0';i++) ?
改為:
for(i=0;i<s.length();i++) ?
添加回答
舉報(bào)
0/150
提交
取消