通过另一个类修改字符串时的Nullpointer异常 - Java

时间:2013-07-31 08:19:05

标签: java class

在我的主要方法中,我这样做:

RTAlgorithm rt = new RTAlgorithm();
String s = "Looooolasdasdl";
rt.encrypt(s);
System.out.println(s);

这是我的RT课程:

package rt.encrypt;

public class RTAlgorithm
{
public static String encrypt(String s) {
    alg_flip(s);
    return s;
}

private static String alg_flip(String s) {
    String s1 = "";
    for(int i = s.length() - 1; i >= 0; i++) {
        s1 = s1 + s.charAt(i);
    }
    return s1;
}
}

然而,它在主要方法中的rt.encrypt(s)行给我一个NullPointerException

7 个答案:

答案 0 :(得分:4)

如果您在.modify中返回方法中的值,则必须返回值:

你在做:

String s = "Looooolasdasdl";
rt.modify(s);
System.out.println(s);

你需要做

String s = "Looooolasdasdl";
String s2 = rt.modify(s);
System.out.println(s2);

在修改方法中,您需要返回alg_flip()调用

public String modify(String s) {
    return alg_flip(s);
}

修改

如果您使用大量算法,则应考虑Strategy Pattern

你尝试的主要问题仍然是你用一个参数调用一个方法,但你不保存你从return语句中得到的结果。

编辑2:

我遇到了你的主要问题,虽然返回部分也是一个问题:

for(int i = s.length() - 1; i >= 0; i++) {
    s1 = s1 + s.charAt(i);
}

你想获得我的字符并进行for循环反转,但你加上你的i变量

for(int i = s.length() - 1; i >= 0; i--) {
    s1 = s1 + s.charAt(i);
}

这是你应该做的事情

这对我有用:

public class Main {

    public static void main(String[] args) throws ParseException {

        RTAlgorithm rta = new RTAlgorithm();
        String s = "Looooolasdasdl";
        s = rta.encrypt(s);
        System.out.println(s);

    }
}

class RTAlgorithm {
    public static String encrypt(String s) {
        return alg_flip(s);
    }

    private static String alg_flip(String s) {
        String s1 = "";
        for (int i = s.length() - 1; i >= 0; i--) {
            s1 = s1 + s.charAt(i);
        }
        return s1;
    }
}

但是如果编写静态方法,则不需要创建实例。

而不是rt.encrypt(s);你可以说RTAlgorithm.encrypt(s);

答案 1 :(得分:1)

唯一的原因是

rt.modify(s);

您在使用之前忘了初始化rt

答案 2 :(得分:0)

这意味着您的rt变量指的是null。您应该创建一个由rt变量引用的对象,如下所示。

RT rt = new RT();// or whatever your class name is

答案 3 :(得分:0)

未声明rt类。你应该插入行

Rt rt = new Rt();

使用之前。 此外,还有一个问题需要注意。 alg_flip方法什么都不做。你获取String,使用它来生成一个String s1并返回它。顺便说一句,你永远不会做

s = alg_flip(s);

所以你永远不要在s变量中推送s1值。

答案 4 :(得分:0)

主要方法:

String s = "Looooolasdasdl";
String s_modified = rt.modify(s);
System.out.println(s_modified);

rt课程:

String modify(String s) {
  return alg_flip(s);
}

private static String alg_flip(String s) {
  String s1 = "";
  for(int i = s.length() - 1; i >= 0; i++) {
    s1 = s1 + s.charAt(i);
}
return s1;

}

答案 5 :(得分:0)

rt.modify(s); // since modify() is not a static method 
                you have to initialize rt first

否则您可以将modify()方法设为静态,如下所示

public static String modify(String s) {
alg_flip(s);
return s;
}

现在您可以访问此方法ClassName.modify()

答案 6 :(得分:0)

字符串是不可变对象!所以你不能修改一个字符串!

你必须这样做:

String s = "Looooolasdasdl";

//rt.modify(s); //Mistake 1
s = rt.modify(s); //Reassign to s
System.out.println(s);

你的RT.class应该是:

package rt.encrypt;

public class RTAlgorithm
{
public static String encrypt(String s) {

//    alg_flip(s); // Mistake 2: You create the String you want return
    s = alg_flip(s);  //  but you have to reassign it to var s!
    return s;
}

private static String alg_flip(String s) {
    String s1 = "";
    for(int i = s.length() - 1; i >= 0; i++) {
        s1 = s1 + s.charAt(i);
    }
    return s1; //You have to return a new string reference
}
}