为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

不负相思意 2018-12-06 18:48:03
这是一个关于复数的小程序,运行表示由字符串构造复制对象这个构造函数出现问题,求帮忙,运行提示的错误如下: 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贡献1796条经验 获得超4个赞

我刚才验证过了,是d1=s.substring(0, i-1)的参数i-1可能会得到一个负数的值,因为你前面使用的s.charAt(i)返回的i的值可能是0,而substring(int beginIndex,int endIndex)这个方法返回的是一个字串,改字串以索引为beginIndex的字符开始直到索引为endIndex的字符结束(包含索引为beginIndex的字符,不包含索引为endIndex的字符),你出错的地方正是在对这两个知识点的理解上。我看了你的题目真心没看懂你要做什么,所以也不好给你改代码以符合你的题目要求,你可以根据你的题目的要求做一些变动去解决上述两个问题。下述编译结果只是我强制用if语句限定执行条件后得到的一个结果:

查看完整回答
反对 回复 2018-12-16
?
四季花海

TA贡献1811条经验 获得超5个赞

数组越界了,自己查查吧

查看完整回答
反对 回复 2018-12-16
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

谢谢 啊,能不能告诉我应该怎么改啊,刚学不怎么懂啊

查看完整回答
反对 回复 2018-12-16
?
手掌心

TA贡献1942条经验 获得超3个赞

楼主是用C、C++的?

for(i=0;i!='\0';i++)  

改为:

for(i=0;i<s.length();i++)  

查看完整回答
反对 回复 2018-12-16
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

不是啊,用的myeclipse

查看完整回答
反对 回复 2018-12-16
?
茅侃侃

TA贡献1842条经验 获得超21个赞

改过还是不对啊

查看完整回答
反对 回复 2018-12-16
  • 7 回答
  • 0 关注
  • 612 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信