关于java的小问题,请高手帮忙解决,急

这是一个关于复数的小程序,运行表示由字符串构造复制对象这个构造函数出现问题,求帮忙,运行提示的错误如下: 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的模");

 }

}

不负相思意
浏览 613回答 7
7回答

SMILET

我刚才验证过了,是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

茅侃侃

改过还是不对啊
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java