簡體   English   中英

具有將某些數據取回並發送回去的功能

[英]Have a function take some data and send it back

我正在嘗試使Java函數接受一些輸入,將其更改並發送回去。 通常,您將返回varName;。 或某些東西,但是這里不起作用。 我的問題是:如何使自定義方法接受變量“ nameRaw”並在函數“ nameChanger()”中對其進行更改,然后將更改后的名稱放入變量:“ nameChanged”。

我已經使用IDEONE.com來顯示代碼並對其進行處理,因此這里是鏈接: http : //ideone.com/cdj6Cd

如果您不信任隨機鏈接,那就可以找到並且完全可以理解。 因此,我也將其放在此處,只是假設用戶輸入的唯一內容是“測試”。

碼:

/* 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,Aaron

簡短答案 :您需要在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中的String是不可變的。 因此,您需要返回修改后的字符串並在main方法中捕獲返回的值。

另外,由於上述原因,您無需將nameChanged傳遞給nameChanger

由於在Java中方法調用始終是按值調用 ,因此無法像在C中使用指針那樣在當前塊(例如方法)之外更改變量。您將需要使用返回值並將其分配給變量

nameChanged = nameChanger(nameRaw, nameChanged);

或創建某種形式的內部可操作變量的Holder對象。

您正在嘗試通過副作用更改變量。 請注意,當您調用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;
}

如果我理解正確,您想創建一個將字符串作為參數的方法,對其進行處理,然后返回更改后的值。

您距離不遠:

/**
* NameChanger method takes a string as a parameter 
* and replaces its "s" with "z" then sends it back
*/
private static String nameChanger(String nameRaw) {
    String cReturnedString = nameRaw; 
    if(nameRaw.contains("s")) {
        cReturnedString = nameRaw.replace("s", "z");
    } 
    return cReturnedString;
}

// From another method
String cMyNewString = nameChanger("sissy");
System.out.println(cMyNewString); //Outputs "zizzy"

我改變了什么:

  • 刪除了多余的參數-您無需在方法的參數中傳遞要返回的字符串。

  • 使用與nameRaw變量相同的值初始化返回的字符串。 如果您的nameRaw不包含“ s”,則您不希望返回null。

您不傳遞可更改的變量。 相反,將您的代碼更改為main()的以下方法調用:

String nameChanged = nameChanger(nameRaw);

並在實際創建它的方法中創建要返回的變量:

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

這行:

nameChanger(nameRaw, nameChanged);

需要是這樣的:

nameChanged = nameChanger(nameRaw, nameChanged);

之所以如此,是因為Java是按值傳遞。 因此,您將傳入String的值而不是其引用。

如果您真的很想能夠更改nameChanged nameChanged必須是一個具有適當的setter / getter的(通常是可變的)對象,而不是原始的對象。 在這種情況下,您將通過“對象引用的副本”值進行傳遞,這使您可以在方法內更改對象的內容(如果它不是不可變的)

此方法中的private static String nameChanger(String nameRaw, String nameChanged) ,為什么要傳遞nameChanged 我認為nameChanged應該是nameChanger方法結尾處返回的值。

我不明白為什么您要檢查nameChanged是否為null,但您將其初始化為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

我希望這有幫助

謝謝所有回答的人! 您所說的一切都幫助我解決了這個問題!

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

謝謝你們的幫助,我非常感謝您的時間和腦力向我解釋原因以及原因!

謝謝,最好的問候,亞倫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM