2017-05-09 16 views
-5
public static void main(String[] args) { 
      // TODO code application logic here 
      Scanner in =new Scanner(System.in); 
      long n=in.nextLong(); 
      int i,j,k; 
      //byte k; 
      int count=0; 
      String str[]; 
      str= new String[100000]; 
      for(i=0;i<n;i++) 
       str[i]=in.nextLine(); 
      for(i=0;i<n;i++) 
       for(j=0;j!=i&j<n;j++) 
        for(k=0;str[i].charAt(k)!=-1||str[j].charAt(k)!=-1;k++) 
        { 
         if(str[i].charAt(k)!=str[j].charAt(k)) 
          break; 
         else 
          count++; 
        } 




      System.out.print(count); 
} 
+1

你永远检查您的字符串长度的输入键所产生的新的生产线。为什么*不会抛出异常? – shmosel

+1

你做了什么来调试呢?即使printf调试也会显示问题。循环显示n和i的值。使用'length'属性来确认你的猜测。请参阅:https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – jdv

+2

@Marvin'n'影响数组索引,这不是这里的直接问题。 – shmosel

回答

0

你是否来自C背景?这不是你如何检查,如果你是在Java中的字符串的结尾(甚至用C你想要&&||反正):

str[i].charAt(k)!=-1||str[j].charAt(k)!=-1 

你想要的是一样的东西:

k < str[i].length() && k < str[j].length() 
0

因为您试图访问索引无效的字符串中的字符。

for(i=0;i<n && i < str.length;i++) 
       for(j=0;j!=i&j<n;j++) 
        for(k=0;(str[i].length() > k && str[j].length() > k) ;k++) 
        { 
         if(str[i].charAt(k)!=str[j].charAt(k)) 
          break; 
         else 
          count++; 
        } 
0

使用此代码

BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
for (i = 0; i <n; i++) { 
     str[i] = br.readLine(); 
    } 

代替

for (i = 0; i <n; i++) { 
     str[i] = in.nextLine(); 
    } 

你所有的问题将得到解决。

或者你可以发射一个空白

in.nextLine(); 

跳过,可以通过按这样

in.nextLine(); 
for (i = 0; i <n; i++) { 
     str[i] = in.nextLine(); 
    } 
+0

为什么这会解决这个问题?他得到ArrayOutOfBound而不是NullPointerException! –

+0

这是因为in.nextInt()方法不会消耗输入的最后一个换行符(它是在按下Enter键后生成的),并且在for循环中,在下一次调用in.nextLine() 。所以在i = 0时的循环中,值为str [i = 0] =“\ n”,当他试图访问str [j = 0] .charAt(k = 0)时,他得到这个错误“java.lang。 StringIndexOutOfBoundsException“,因为该字符串(str [j = 0])的长度是-1。 –

相关问题