2013-04-22 146 views
-1

这是我的代码添加到二进制字符串,我得到正确的值res字符串,但它仍然给我在执行结束时的异常。 字符串m1 & m2长度相等,均为28。 尽管如此,我仍然试图运行循环10次来验证,但错误仍然存​​在。 对于任何值i均适用,不管是大于还是小于两个字符串的实际长度。字符串索引越界

public static String addMantissa(String m1,String m2) 
{ 
    String res=" "; 
    int c=0; 
    System.out.println("Length is " + m2.length()); 
    int i=0; 
    while(i < m2.length()) 
    { 
     System.out.print(" " + res.charAt(i)); 
     if(m1.charAt(i)=='1' && m2.charAt(i)=='1') 
     { 
      if(c==0) 
      { 
       res+="0"; 
       c=1; 
      } 
      else 
      { 
       res+="1"; 
       c=1; 
      } 
     } 

     if(m1.charAt(i)=='1' && m2.charAt(i)=='0') 
     { 
      if(c==0) 
      { 
       res+="1"; 
       c=0; 
      } 
      else 
      { 
       res+="0"; 
       c=1; 
      } 
     } 

     if(m1.charAt(i)=='0' && m2.charAt(i)=='1') 
     { 
      if(c==0) 
      { 
       res+="1"; 
       c=0; 
      } 
      else 
      { 
       res+="0"; 
       c=1; 
      } 
     } 

     if(m1.charAt(i)=='0' && m2.charAt(i)=='0') 
     { 
      if(c==0) 
      { 
       res+="0"; 
       c=0; 
      } 
      else 
      { 
       res+="1"; 
       c=0; 
      } 
     } 
     i++; 
    } 

    return res; 
} 

在此先感谢。

+0

你可以发布你的实际错误和跟踪。 – TheMerovingian 2013-04-22 14:10:43

+0

什么是输入(m1&m2)?? – 2013-04-22 14:16:27

+0

如果你通过OR('||')分隔条件,或者更简单些,'m1.charAt(i)+ m2.charAt(i)==' 1'+'0'或m1.charAt(i) - '0'+ m2.charAt(i) - '0'== 1'。我会用临时变量替换这些charAt(用“0”减去)。 – Dukeling 2013-04-22 14:18:02

回答

0

@ShreyosAdikari基本上是对的。

System.out.print(" " + res.charAt(i)); 

应该在循环结束时调用,因为res [i]被填充。 也许你的意思是:

System.out.print((" " + res).charAt(i)); 

但你不打印的最后一个循环的资源。

+0

我也评论过这一行,我不认为那里有错误。 – user1918034 2013-04-22 14:30:59

+0

我给出了另一个答案先生。请你验证一下吗? – 2013-04-22 14:34:01

+0

@ShreyosAdikari,当你改变了你的答案,我删除了我对你之前的答案的参考。你的新答案当然是坚如磐石的,防守性的编程,就像我也会这样做。 – 2013-04-22 14:51:24

0

其实除了来自行

while(i < m2.length()) 

您需要将其更改为

while(i < m2.length() && i<m1.length()) 

仿佛M1(比如1)的长度比m2低(比如4)和你只检查m2的值。然后在第二次迭代中,它将作为2 < 4进入循环,并且当它尝试获取m1.carAt(2)(作为长度1)时,它将抛出字符串索引超出范围异常。

+0

是的,对,excation在数据行上,但加上&& condition条件工作我,因为它是相同的长度。 – user1918034 2013-04-22 14:35:31

+0

然后你必须相应地改变整个逻辑。 – 2013-04-22 14:36:40

+0

wat的意思是dat? – user1918034 2013-04-22 14:38:15

1

你的整个方法可以只由一个行代替:

public static String addMantissa(String m1, String m2) { 
    return new BigInteger(m1, 2).add(new BigInteger(m2, 2)).toString(2); 
} 

在你的问题中提到的28位大小意味着,Integer类可以具有用于解析neen,但使用BigInteger意味着串任何大小都可以处理。

您应该使用JDK而不是重新发明轮子。

此外,“少代码好”是一个伟大的口头禅(当然,只要代码保持清晰),并且此代码具有高密度。

+0

在哪里我要把它的末端支架给我一个错误的数据 – user1918034 2013-04-22 15:14:45

+0

对不起 - 我遗漏了一个右括号。现在修复 - 请参阅编辑答案。 (我在iPhone上键入了这段代码......有时候我的脑内编译器错过了这样的事情) – Bohemian 2013-04-22 15:19:47

+0

它给了我这个异常 线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: 26 \t at SinglePrecision.main(Unknown Source) – user1918034 2013-04-22 15:22:53