这是一个关于复数的小程序,运行表示由字符串构造复制对象这个构造函数出现问题,求帮忙,运行提示的错误如下: 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的模");
}
}
我刚才验证过了,是d1=s.substring(0, i-1)的参数i-1可能会得到一个负数的值,因为你前面使用的s.charAt(i)返回的i的值可能是0,而substring(int beginIndex,int endIndex)这个方法返回的是一个字串,改字串以索引为beginIndex的字符开始直到索引为endIndex的字符结束(包含索引为beginIndex的字符,不包含索引为endIndex的字符),你出错的地方正是在对这两个知识点的理解上。我看了你的题目真心没看懂你要做什么,所以也不好给你改代码以符合你的题目要求,你可以根据你的题目的要求做一些变动去解决上述两个问题。下述编译结果只是我强制用if语句限定执行条件后得到的一个结果:
谢谢啊,出错误的地方是一个构造方法,想要完成由字符串构造复数对象,虽然没有错了,但是功能还是没有实现,总之谢谢啦!!!
@左手、右手: 我贴出来的代码只是告诉你你的代码什么地方出了问题,出问题的原因是什么,是无法按你的题目要求实现你的功能的
数组越界了,自己查查吧
谢谢 啊,能不能告诉我应该怎么改啊,刚学不怎么懂啊
楼主是用C、C++的?
for(i=0;i!='\0';i++)
改为:
for(i=0;i<s.length();i++)
不是啊,用的myeclipse
改过还是不对啊
@左手、右手:
哦,是substring这报错了。
可能要控制一下i-1不为负。
@向往-SONG: 额,具体要怎么搞啊,我弄了好一会还是搞不定啊