我有两个类,
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)
在您的代码中,私有字符串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);
}
因为在执行构造函数代码之前会初始化类变量。因此,在此之前,str
是null
,这导致了这个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 。这 将不会被 垃圾收集过,如果是通过默认加载器访问。 看到下面这个链接,我问了一个问题。这可能与您的问题没有