2014-12-11 76 views
0

所以我创建这个随机字符串发生器:找不到符号错误的Java

public class Test { 
    public static void main(String[] args) { 
    String strings = "[email protected]#$%&()ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    Random generator = new Random(System.currentTimeMillis()); 
    int stringLength = strings.length()-1; 
    Character character; 
    for (int i = 0; i < stringLength; i++) { 
     Double test = new Double(Math.random()); 
     character = strings.charAt(test.intValue()); 
     String outputString = outputString.concat(character.toString()); 
    } 
    System.out.println(outputString); 
    } 
} 

我去一个编译它使用javac Test.java,和它给我的错误outputString可能没有被初始化为线14和16.因此,我将字符串关键字添加到第14行,现在它告诉我 cannot find symbol: variable outputString

这是为什么?

编辑:

好了,所以我接受了建议,这是目前代码:

public class Test { 
    public static int randomInt(int min, int max, long seed) { 
    Random rand = new Random(seed); 
    int randomNum = rand.nextInt((max-min)+1) - min; 
    return randomNum; 
    } 

    public static void main(String[] args) { 
    String strings = "[email protected]#$%&()ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    int stringLength = strings.length()-1; 
    Character character; 
    for (int i = 0; i < stringLength; i++) { 
     Double test = new Double(randomInt(0, stringLength, System.currentTimeMillis())); 
     character = strings.charAt(test.intValue()); 
     System.out.print(character); 
    } 
    } 
} 

代码运行没有错误,但它不显示任何信息。 我目前使用命令提示编译它。

+0

您的代码只有14行。第16行如何出现错误? – Barmar 2014-12-11 01:54:32

+0

我在'public class test'之前有一个导入行。 – 2014-12-11 02:10:07

+0

如果你没有在你的问题中引用行号会更好。即使它们是正确的,你是否真的希望我们能够计数? – Barmar 2014-12-11 02:11:17

回答

0

我设法得到它使用以下代码工作:

import java.util.Random; 

public class Test{ 

    public static void print(String str) { 
     System.out.print(str); 
    } 

    public static int randomInt(int min, int max) { 
     Random rand = new Random(System.currentTimeMillis()); 
     int randomNum = rand.nextInt((max-min)+1) - min; 
     return randomNum; 
    } 

    public static void main(String[] args) throws InterruptedException { 
     String strings = "[email protected]#$%&()ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     int len = strings.length() - 1; 
     StringBuilder outputString = new StringBuilder(len); 
     for (int i = 0; i < len; i++) { 
      Double test = new Double(randomInt(0, len)); 
      Integer value = test.intValue(); 
      if (value <= len) { 
       //print(value.toString()); For testing purposes 
       outputString.append(strings.charAt(value)); 
       Thread.sleep(1); 
      } 
      else {i--;} 
     } 
     print(outputString + "\n"); 
    } 
} 
2

您只在for循环内部定义了outputString。它不会在外面使用。

,你可以直接输出字符:

for (int i = 0; i < stringLength; i++) { 
    Double test = new Double(Math.random()); 
    character = strings.charAt(test.intValue()); 
    System.out.print(character); 
} 
System.out.println(); 

如果你坚持串联循环中的字符串,请使用StringBuilder代替。


下一个问题你会遇到:

Double test = new Double(Math.random()); 
strings.charAt(test.intValue()); 

,将永远得到的第一个字符。双倍将在0(含)和1(不含)之间。您需要create a random integer between 0 and the length of your alphabet

+0

当我在循环外部定义了outputString时,它给了我两个错误,表示outputString可能未被初始化 – 2014-12-11 02:11:19

+0

您想将其初始化为空字符串('“”'); – Thilo 2014-12-11 02:25:54

0

编译器正确地告知outputString未正确声明。 outputStringfor循环内声明,但您试图在外部打印该值。

一个快速的方法来解决,这将是由具有outputString = ""申报outputStringfor环路之外;

+0

感谢您对其进行了适当的更改。 – kuriouscoder 2014-12-11 01:57:27

0

outputString仅在for循环的块内定义,因此一旦您退出它,就不再存在。为了确保您的代码工作,把它定义外循环:

String outputString = ""; 
for (int i = 0; i < stringLength; i++) { 
    Double test = new Double(Math.random()); 
    character = strings.charAt(test.intValue()); 
    outputString += character.toString(); 
} 
System.out.println(outputString); 
0

这是因为你在呼唤outputString.concat你intialized之前 尝试

String outputString = ""; 
outputString = outputString.concat(character.toString());`