2016-08-29 6 views
0

Я пытаюсь сделать функцию 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() 
} 

Спасибо, ребята надеюсь, что это не захлестнуть вас toooo много: р, Аарон

+0

Вам не нужно 'если (nameRaw.contains ("S"))' чек. Это пустая трата времени. Просто сделайте 'nameRaw.replace (" s "," z ");' – 4castle

+0

Вы не можете объединить «null» в строку. – 4castle

ответ

0

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

Я надеюсь, что это помогает

0

Короткий ответ: Вы должны сделать это в методе main:

nameChanged = nameChanger(nameRaw, nameChanged);

Пояснение: Если вы измените значение, на которое указывает ссылка объекта в другом методе, это изменение не будет отображаться вызывающему методу. В вашем случае nameChanged объявлен в методе main и переназначается в методе 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"); 

и изменения будут видны в главном методе.

Однако в вашем случае это невозможно, потому что String s в Java неизменяемы. Следовательно, вам нужно вернуть измененную строку и захватить возвращаемое значение в методе main.

Кроме того, по причинам, описанным выше, вам не нужно передавать nameChanged в nameChanger.

0

Поскольку вызовы метода Java всегда call-by-value, вы не можете изменять переменные за пределами своего текущего блока (например, метод), как вы могли, используя указатель в C. Вам нужно либо использовать возвращаемое значение, либо назначить его переменная

nameChanged = nameChanger(nameRaw, nameChanged); 

или создать объект формы, который внутренне манипулирует переменной.

0

Вы пытаетесь изменить переменную с помощью побочных эффектов. Обратите внимание, что при вызове 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; 
} 
0

Если я правильно понял, вы хотите создать метод, который берет строку в качестве параметра, обрабатывает ее и затем возвращает измененное значение.

Вы не за горами:

/** 
* 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. Если ваше имяRaw не содержит «s», вы не хотите, чтобы null был возвращен.

0

Вы не передадите переменную, которая может быть изменена. Вместо этого, изменить свой код на следующий вызов метода в main():

String nameChanged = nameChanger(nameRaw); 

и создать переменную, которую вы хотите вернуться в методе вы на самом деле его создания:

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

Эта строка:

nameChanger(nameRaw, nameChanged); 

должно быть что-то вроде:

nameChanged = nameChanger(nameRaw, nameChanged); 

Причина этого в том, что Java является передачей по значению. Таким образом, вы передаёте значение строки вместо ссылки.

Если вы действительно хотите изменить nameChanged; nameChanged должен быть (обычно изменяемым) объектом с соответствующим установщиком/получателем вместо примитива. В этом случае, вы бы передать по значению «Копия ссылки объекта», который позволяет изменять содержимое объекта в методе (если это не неизменная)

0

Спасибо всем, кто ответил! Все, что вы сказали, помогло мне решить это!

Мое решение: nameChanged = nameChanger(nameRaw, nameChanged)

Спасибо ребята за помощь Я очень ценю ваше время и силы мозга, чтобы объяснить это мне и почему!

Спасибо и наилучшими пожеланиями, Аарон

Смежные вопросы