我收到错误 - 线程中的异常&#34; main&#34; java.lang.StringBuffer上的java.lang.NullPointerException。<init>(未知来源)

时间:2015-07-24 20:11:26

标签: java

在一系列字符串中&#39; a&#39;有&#39; n&#39;字符串我必须从给定的字符串中选择佩林对。为ex输入 3 BBA ABB ABB 输出= 2 我做错了什么

import java.util.*;
class Test {
  public static void main(String args[]) {
    int i,j,k=0;
    Scanner h=new Scanner(System.in);
    int n=h.nextInt();
    String a[]=new String[n];

    for(i=0;i<n;i++) {
      if(a[i]!="") {
        String rev = (new StringBuffer(a[i])).reverse().toString();
        for(j=i+1;j<n;j++) {
          if(rev.equals(a[j])) {
            k++;
            a[j]="";
          }
        }
      }
    }

    h.close();
  }
}

2 个答案:

答案 0 :(得分:4)

您正在创建一个String数组,但从不初始化其成员。

成员的默认值为null。

因此,当您致电new StringBuffer(a[i])时,您传递的是空值。

你可以通过以下方式避免这种情况:

  • 用某种东西填充数组。
  • 除了现有的空字符串检查外,还要检查空值。

顺便说一下,您尝试使用等于运算符!=检查空字符串。这将检查引用是否不同,而不是它们指向的String对象包含不同的字符串。您将要使用以下任一方法检查:

  (null != a[i]) && ! a[i].isEmpty()

  ! "".equals( a[i] )

或者,如果您正在使用Google的番石榴库:

  ! Strings.isNullOrEmpty( a[i] )

答案 1 :(得分:1)

您很可能希望从控制台中读取您未执行的操作。我建议你使用Scanner.nextLine()。

int n=h.nextInt();
h.nextLine(); // discard the rest of the line.
String a[]=new String[n];

for(int i = 0; i < n; i++) {
   // read a word.
   a[i] = h.nextLine();