2013-01-07 50 views
0

我有一个void方法,它应该接受一个字符串并根据分隔符将它分成两个字符串。使用调试器后,该方法似乎正常工作,但传递给存储结果的方法的两个空字符串似乎没有更新。我必须在这里做一些愚蠢的事情,但任何帮助表示赞赏!void方法不会操纵字符串

public static void main(String[] args) { 
    String dictFile = "/Users/simonrhillary/Desktop/Dictionary(3).txt"; 
    String synFile = "/Users/simonrhillary/Desktop/Synonyms(2).txt"; 
    fileReader dictFR = new fileReader(); 
    fileReader synFR = new fileReader(); 
    dictFR.filePath = dictFile; 
    synFR.filePath = synFile; 
    dictFR.openFile(dictFile); 
    synFR.openFile(synFile); 
    String[] dictionary = dictFR.fileToArray(); 
    String[] synonyms = synFR.fileToArray(); 
    String regx = "^[aflmptu]+$"; 
    String regexTemplate = "^[]+$"; 
    String word1 = ""; 
    String word2 = ""; 
    synToWords(synFR.getLine(3), word1, word2);//error seems to be here. 
                 //word1 and word 2 stay "" 
    System.out.println(word1 +" " + word2); 
    printArray(findCombos(dictionary, word1, word2)); 

} 

public static void synToWords(String syn, String wordI, String wordII){ 
    String[] words = syn.split("\\t"); 
    wordI = wordI + words[0]; 
    wordII = wordII + words[1]; 
} 

还有其他的方法我没有发布,但他们都工作正常。这只是synToWords方法的问题所在。非常感谢!

回答

7

Java passes references by value。所以这条线:

wordI = wordI + words[0]; 

分配一个新的字符串wordI但也仅仅是这改变了参考的地方(在方法中)的副本。原来的word1变量还是指原来的String。

要使其工作,你可以使用,而不是一个数组:

public static void synToWords(String syn, String[] word1And2){ 
    String[] words = syn.split("\\t"); 
    word1And2[0] = word1And2[0] + words[0]; 
    word1And2[1] = word1And2[1] + words[1]; 
} 

,并在你的主代码:

String[] words = { "", "" }; 
synToWords(synFR.getLine(3), words); 
System.out.println(words[0] +" " + words[1]); 

或者你可以简单地返回字符串的数组:

public static String[] synToWords(String syn){ 
    String[] words = syn.split("\\t"); 
    return new String[] {words[0], words[1]}; 
} 

String[] words = synToWords(synFR.getLine(3)); 
System.out.println(words[0] +" " + words[1]); 
+0

好的我认为这可能是这样的,我应该改变返回类型并运行该方法两次吗? –

+1

最好不要将方法拆分出来,或者更好的是使用'Scanner'。 –

1

Java完全是按值调用。 wordI和wordII是两个参考表达式的值的副本。引用表达式为null或指向对象的指针。当你分配给例如在synToWords中,您只会更改synToWords的本地副本指向的字符数。

一个解决方案是让该方法返回一个包含两个部分的String []。调用者然后可以将结果的元素分配给它的变量。