【问题标题】:Have a function take some data and send it back让一个函数获取一些数据并将其发回
【发布时间】:2017-01-05 21:18:05
【问题描述】:

我正在尝试使 java 函数接受一些输入,对其进行更改并将其发送回。通常你会返回 varName;或其他东西在这里它不起作用。我的问题是:如何创建自定义方法来接收变量 'nameRaw' 并在函数 'nameChanger()' 中更改它,然后将更改后的名称输出到变量:'nameChanged'。

我已经使用IDEONE.com来展示代码和处理它,所以这里是链接:http://ideone.com/cdj6Cd

如果您不信任随机链接,那是完全可以理解的。所以,我也会把它放在这里,但只是假设用户输入的唯一内容是“Test”。

代码:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception {
        System.out.println("*INTENDED* Function of this-To create a custom method to take in a variable 'nameRaw' and change it within the function 'nameChanger()' then out put the changed name to variable: 'nameChanged'.\nProblem: the name changes within the function 'nameChanger()' only, therefore I cannot call the variable 'nameChanged' elsewhere, such as in main().........\n\n\n");
        // Initalize the Java Scanner
        Scanner in = new Scanner(System.in);

        // Initalizes a completely empty string with name "nameChanged"
        String nameChanged = null;

        System.out.println("Please enter a username for yourself below:");
        System.out.println("Test"); // Fake input to make me feel good I guess, it just looks better

        // Sets "nameRaw" to "Test"
        String nameRaw = in.nextLine();

        // Spits out the untouched value that the user has entered
        System.out.println("\nRaw name before passing to custom method: " + nameRaw);

        // Puts "nameRaw" into the custom method "nameChanger()" to change the, "s" in, "Test" to a "z" by default
        nameChanger(nameRaw, nameChanged);

        // Spits out the touched and changed nameChanged variable from "nameChanger()"
        if(nameChanged == null) {
            System.out.println("\nHere is the failed changed name: " + nameChanged);
            System.out.println("\nARE YOU KIDDING ME! WHY DOES THIS NOT WORK?!?! PLEASE HELP!!!!");
        } else {
            System.out.println("Here is the successfuly changed name: " + nameChanged);
            System.out.println("\nWhoever solved this problem is a god..");
        }

    } // Closes method main()

    // Custom method named "nameChanger" that will need a variable named "nameRaw" *which is set* within its () to function
    private static String nameChanger(String nameRaw, String nameChanged) {

        //// Initalizes a completely empty string with name "nameChanged"
        //String nameChanged = null;

        // States the set name *unchanged* from the main method on line 17
        System.out.println("\t#\tName unchanged read and displayed by the nameChanger custom method: " + nameRaw);

        // The name by default "Test" does contain an "s" so the if statement is satisfied
        if(nameRaw.contains("s")) {

            // The variable "nameRaw should be running through here and having it's "s" replaced with a "z"
            nameChanged = nameRaw.replace("s", "z");

            // Output the changed name *if all goes right*
            System.out.println("\t#\tName changed *still in custom function* is: " + nameChanged);

        // The else statement is just for testing purposes, such as changing "Test" as the input to "Demo" to dis-satisfy the if statemtent 
        } else {
            System.out.println("\t#\tFor reference, here is the unchanged name raw: " + nameRaw);
            System.out.println("\t#\tAlso for reference, here is the null value 'nameChanged': " + nameChanged);
        }

        // One more time to show my hate toward Java, output the changed variable "nameChanged". Take note that the "s" is a "z".....
        System.out.println("\t#\tPlease don't be null or have an 's' in it: " + nameChanged);

        // To output to main() that nameChanged is now not null *if all goes right*, but "Tezt" should be the output
        return nameChanged;
    } // Close custom method, nameChanger()
}

谢谢大家,希望这不会让你不知所措:p, 亚伦

【问题讨论】:

  • 您不需要if (nameRaw.contains("s")) 检查。那是浪费时间。就做nameRaw.replace("s", "z");
  • 你不能用字符串连接null

标签: java function variables methods


【解决方案1】:

private static String nameChanger(String nameRaw, String nameChanged) 在这个方法中,你为什么要传递nameChanged?我认为nameChanged 应该是nameChanger 方法末尾返回的值。

我不明白您为什么要检查 nameChanged 是否为空,但您将其初始化为 null 并且没有更改它。

String nameChanged = null;


if(nameChanged == null) {
        System.out.println("\nHere is the failed changed name: " + nameChanged);
        System.out.println("\nARE YOU KIDDING ME! WHY DOES THIS NOT WORK?!?! PLEASE HELP!!!!");
    } else {
        System.out.println("Here is the successfuly changed name: " + nameChanged);
        System.out.println("\nWhoever solved this problem is a god..");
    }

如果你还是按照你的方法,试试 nameChanged = nameChanger(nameRaw, nameChanged) 而不是nameChanged = null

希望对你有帮助

【讨论】:

    【解决方案2】:

    由于在 Java 中方法调用始终是 call-by-value,因此您不能像在 C 中使用指针那样更改当前块之外的变量(例如方法)。您需要使用返回值并将其分配给变量

    nameChanged = nameChanger(nameRaw, nameChanged);
    

    或创建某种形式的持有者对象,它在内部操纵变量。

    【讨论】:

      【解决方案3】:

      您不会传递可能会发生变化的变量。相反,将您的代码更改为main() 中的以下方法调用:

      String nameChanged = nameChanger(nameRaw);
      

      并在您实际创建它的方法中创建要返回的变量:

      private static String nameChanger(String nameRaw) {
          String nameChanged = null; //
          // ...
          // and then
          return nameChanged;
      }
      

      【讨论】:

        【解决方案4】:

        您正在尝试通过副作用更改变量。请注意,当您调用 nameChanger() 时,您实际上并未将返回值分配给变量。

        String result = nameChanger(nameRaw) 是一种更直接的方法。通常不希望依赖副作用。请注意,我还更改了方法签名,因为您现在不需要向它传递您希望存储结果的变量,您可以在方法的范围内创建它。

        public static String nameChanger(String nameRaw) {
            String result = "";
            // do stuff
            if(nameRaw.contains("s")) {
                result = nameRaw.replace("s", "z");
            }
            //more stuff and System.out.println() statements
            return result;
        }
        

        【讨论】:

          【解决方案5】:

          这一行:

          nameChanger(nameRaw, nameChanged);
          

          需要类似于:

          nameChanged = nameChanger(nameRaw, nameChanged);
          

          之所以会出现这种情况,是因为 Java 是按值传递的。因此,您正在传递 String 的值而不是其引用。

          如果你真的,真的想改变nameChangednameChanged 需要是一个(通常是可变的)对象,具有适当的 setter/getter 而不是原语。在这种情况下,您将通过值“对象引用的副本”传递,这允许您在方法中更改对象的内容(如果它不是不可变的)

          【讨论】:

            【解决方案6】:

            简答: 您需要在 main 方法中执行此操作:

            nameChanged = nameChanger(nameRaw, nameChanged);

            说明:如果您在不同的方法中更改对象引用指向的值,则调用方法将看不到更改。在您的情况下,nameChangedmain 方法中声明并在nameChanger 方法中重新分配,因此,main 方法中的更改不可见。

            但是,您可以通过调用它的可变方法来修改对象:

            // in the main method
            SomeStudent s = new SomeStudent();
            modifyStudent(s);
            
            // inside modifyStudent method
            // change will be visible in the main method
            s.setResult("PASS");
            

            并且更改将在 main 方法中可见。

            但是,在您的情况下,这是不可能的,因为 Java 中的 Strings 是不可变的。因此,您需要返回修改后的字符串,并在main 方法中捕获返回的值。

            此外,由于上述原因,您不需要将nameChanged 传递给nameChanger

            【讨论】:

              【解决方案7】:

              感谢所有回答的人! 你所说的一切都帮助我解决了这个问题!

              我的解决方案:nameChanged = nameChanger(nameRaw, nameChanged)

              感谢你们的帮助,我非常感谢你们花时间和脑力向我解释这件事以及为什么!

              感谢和最好的问候, 亚伦

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-02-05
                • 1970-01-01
                • 2021-09-30
                • 1970-01-01
                • 1970-01-01
                • 2011-07-09
                • 2018-05-01
                相关资源
                最近更新 更多