字符串内容未在与字符串声明相同的方法中被替换。 (JDA)

Posted

技术标签:

【中文标题】字符串内容未在与字符串声明相同的方法中被替换。 (JDA)【英文标题】:String contents not being replaced within the same method as string declaration. (JDA) 【发布时间】:2020-11-30 15:24:52 【问题描述】:

我正在尝试将随机生成的字符串存储在字符串变量中以用于其他事情。基本上,它是一个密码生成器,用于存储密码以供需要它的命令使用。该应用程序似乎在存储密码以供以后使用时存在问题。代码和输出与预期如下。

public void onGuildMessageReceived(GuildMessageReceivedEvent event) 
    super.onGuildMessageReceived(event);

    String id = "discord userid String";
    long idlong = Long.parseLong(id);
    
    String generatedString = RandomStringUtils.random(15, true, true);
    StringBuilder stored = new StringBuilder(15);

   //password generator
    if (event.getMessage().getContentRaw().equalsIgnoreCase("!passwordgen")) 
        if (stored.toString().isEmpty() == true || idlong == 
        event.getMessage().getAuthor().getIdLong()) 
            stored.replace(0, 14, generatedString);

            User user = event.getMessage().getAuthor();
            user.openPrivateChannel().complete()
                .sendMessage("Your new password is: " + stored + ". You can change your password 
                in the future with !setpassword <currentpassword>.").queue();
            
            else 
                event.getChannel().sendMessage("You do not have permission to generate a new password  
                and/or an initial password has already been set.").queue();
            
        
        
        //set password command      
        if (event.getMessage().getContentRaw().startsWith("!setpassword"))     
            char[] chararr = event.getMessage().getContentRaw().toCharArray();
            
            for (int i = 0; i < chararr.length; i++) 
                if (chararr[i] == ' ') 
                    passwordkeyed += event.getMessage().getContentRaw().substring(13);
                
            
            
            if (passwordkeyed.equals(stored.toString()) && !(passwordkeyed.isEmpty())) 
                stored.replace(0, 14, generatedString); //replaces random password from !passwordgen 
               // with new random password
    
                event.getChannel().sendMessage("Stored: " + stored).queue();
                event.getChannel().sendMessage("Check your DMs!").queue();
                
                User user1 = event.getMessage().getAuthor();
                user1.openPrivateChannel().complete()
                    .sendMessage("Your new password is: " + stored).queue();  
            
                if (!(passwordkeyed.equals(stored.toString()))) 
                event.getChannel().sendMessage("Incorrect password. Stored: " + stored).queue();
            
            
                if (stored.toString().isEmpty()) 
                event.getChannel().sendMessage("Please use !passwordgen to generate an initial password.").queue();
            
        

由于某种原因,在 //password generator 部分中,stored 被替换为随机字符串就好了,但是当您使用 !setpassword 命令输入该密码时,stored 为空,所以它就像 @987654326即使StringBuilder 具有该方法的适当范围,我在密码生成器部分中使用的@ 方法也没有被保存。 我一直在尝试这样做一段时间。我尝试过使用 String、StringBuilder 和 StringBuffer 来查看是否有不同的结果但都具有相同的输出。

输出:

!passwordgen //discord bot command

Your new password is: h50uSKlrWa30Q40. You can change your password in the future with !setpassword 
<currentpassword>. //private message to whoever ran the command

!setpassword h50uSKlrWa30Q40 //discord bot command

Incorrect password. Stored:
Please use !passwordgen to generate an initial password.

预期输出:

 !passwordgen //discord bot command

Your new password is: h50uSKlrWa30Q40. You can change your password in the future with !setpassword 
<currentpassword>. //private message to whoever ran the command

!setpassword h50uSKlrWa30Q40 //discord bot command

Stored: 2Fx8buVxpIEyNYX
Check your DMs!

Your new password is: 2Fx8buVxpIEyNYX //private message to whoever ran the command

在我的脑海中,我在想这可能是我生成随机密码并存储它的方式,但我不确定,因为这似乎是字符串声明本身及其范围的问题

【问题讨论】:

【参考方案1】:

试试:

StringBuilder stored = new StringBuilder(15);

String stored = "";

尝试在public void onGuildMessageReceived(GuildMessageReceivedEvent event)上方添加这个:

private String Stored = "";

每当你想使用它时,请this.Stored

然后看看它是否有效。

另外,尝试添加一条语句,在代码中的随机点以 dms 发送当前存储的字符串,这就是我所说的打印调试,以简单地查看值何时更改以减少搜索。

【讨论】:

如果我使用private String stored = "";并将替换方法更改为stored.replace(".*", generatedString);,则输出为Your new password is: . You can change your password in the future with !setpassword &lt;currentpassword&gt;.,而stored由于某种原因保持不变。我会使用回调将密码存储在 DM 中,但由于某种原因,当我尝试推送时 Heroku 不喜欢这样 尝试执行我提到的“打印-调试”方法并告诉我你得到了什么。也尝试这样做: private Stringbuilder stored = new StringBuilder(15) 从外观上看,密码生成器部分的替换方法甚至没有被替换。这是代码中stored 被操纵的最早点。是因为它是私有的吗? 私有只是意味着变量是唯一的,并且只能在同一个类中访问。现在,generatedString 是空的吗?你确定它包含密码吗? 啊,好吧,很高兴我帮助了你,祝你的计划好运!

以上是关于字符串内容未在与字符串声明相同的方法中被替换。 (JDA)的主要内容,如果未能解决你的问题,请参考以下文章

python 如何替换 text 文本框中被选中的字符

字符串未在此范围内声明 C++

在 SQL 和日期中被问号替换的连字符存储为 NULL

为啥 LINQ 在我的查询中使用错误的数据类型,而它在 EF 架构中被正确声明?

XSLT 在与根元素具有相同命名空间声明的内部标记中缺少命名空间

Beforeinstallprompt 未在应用内浏览器中被调用