当前位置: 首页 > 知识库问答 >
问题:

无法在类构造函数[duplicate]中分配字符串

裴和怡
2023-03-14

我有两个类,

symstring.java

import java.lang.StringBuffer;

public class SymString {
    private String str;
    private int temp = 0, flag = 0;

    public SymString(String paraStr) {
        str = paraStr;
    }

    StringBuffer strBuffer = new StringBuffer(str);

    public int getLength() {
        return (strBuffer.length());
    }

    public boolean isSymStr() {
        for (temp = 0; temp <= getLength(); temp++) {
            if (strBuffer.charAt(temp) == strBuffer.charAt(getLength() - (temp + 1))) {
                flag++;
            }
        }
        if (flag == getLength()) {
            return true;
        } else {
            return false;
        }
    }

    public boolean isSymStr2() {
        if (strBuffer.reverse().equals(strBuffer)) {
            return true;
        } else {
            return false;
        }
    }
}

testsymstr.java


class TestSymStr {

    public static void main(String[] args) {
        SymString Test1 = new SymString("lmfao let's try it out.");
        System.out.println("Is the string symmetric?");
        System.out.println(Test1.isSymStr2());
        System.out.println(Test1.isSymStr());
    }

}

并且它只是抛出异常,似乎没有分配str。为什么?

Exception in thread "main" java.lang.NullPointerException
    at java.lang.StringBuffer.<init>(StringBuffer.java:139)
    at SymString.<init>(SymString.java:13)
    at TestSymStr.main(TestSymStr.java:5)

共有1个答案

汝天宇
2023-03-14

在您的代码中,私有字符串str;使用null初始化字符串。当您调用构造函数时,它也会尝试初始化stringbufferstrbuffer=new StringBuffer(str);。其中调用StringBuffer的构造函数。其代码如下所示:

/**
     * Constructs a string buffer initialized to the contents of the
     * specified string. The initial capacity of the string buffer is
     * {@code 16} plus the length of the string argument.
     *
     * @param   str   the initial contents of the buffer.
     */
    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }

因为在执行构造函数代码之前会初始化类变量。因此,在此之前,strnull,这导致了这个nullPointerException。因此,您可以使用defaulr构造函数创建strBuffer并在构造函数中追加str

    private String str;
    private int temp = 0, flag = 0;
    StringBuffer strBuffer = new StringBuffer();

    public SymString(String paraStr) {
        str = paraStr;
        strBuffer.append(str);
    }


    public int getLength() {
        return (strBuffer.length());
    }

但即使在此之后,您的代码也会中断,因为在issymstr()方法中,您要从0索引迭代到长度,而您需要如下所示迭代到长度-1。

public boolean isSymStr() {
        for (temp = 0; temp < getLength(); temp++) {
            if (strBuffer.charAt(temp) == strBuffer.charAt(getLength() - (temp + 1))) {
                flag++;
            }
        }
        if (flag == getLength()) {
            return true;
        } else {
            return false;
        }
    }
 类似资料:
  • 前面提到的代码是从MDN修改的。这段代码没有任何意图,只是为了变量声明示例的目的。

  • 为什么在派生类构造函数中调用超类构造函数时id的值为0?当创建子对象时,什么时候在堆中为该对象分配内存?在基类构造函数运行之后还是之前?

  • 问题内容: 我正在尝试编写一个程序,该程序采用不同形状的地毯,并使用子类中定义的某些变量创建地毯对象。我的代码是 而子类是 但是每当我尝试编译子类时,都会出现错误 我不确定该如何解决。 问题答案: 由于您的超类没有子类,因此您需要使用 super() 从子类构造函数中显式调用您的超类构造函数。这不必是子类构造函数的第一行。 一个建议: 遵循Java命名约定,变量名称应为camelCase。即,在这

  • 我正在尝试编写一个程序,该程序采用不同形状的地毯,并使用子类中定义的某些变量创建地毯对象。我的代码是 子类是 但每当我试图编译子类时,我都会遇到错误 我不知道该怎么修理它。

  • 我正在做一项关于使用结构化/半结构化/非结构化数据的作业,我正在对莎士比亚的戏剧进行字数统计(以了解语言如何随时间变化),方法是导入每部戏剧的txt文件和xml索引文件,该文件存储有关每部戏剧的关键信息,如编写年份、角色列表等。。然后,我将删除字符名、设置、标点符号和常用词(和、但、或,如果等…)从txt文件准备好进行字数统计-全部在C#中运行的控制台脚本中。我正在编写一个类,每个剧本的数据都将存

  • 问题内容: 我正在查看String API,突然我遇到了一个String空的构造方法,即我们可以使用以下方法构造一个空的String对象: 我不知道有什么用吗? 问题答案: 当然..... 将在堆创建一个非文字串对象 ,这 将是 垃圾收集。 在哪里 将创建一个String Literal 。这 将不会被 垃圾收集过,如果是通过默认加载器访问。 看到下面这个链接,我问了一个问题。这可能与您的问题没有