2012-06-23 2 views
0

У меня возникли проблемы с передачей некоторых переменных с помощью метода, а затем с тем, чтобы этот метод возвращал значение. Метод checkValue должен рассматривать каждый элемент массива в массиве orderSplit, и если с ними происходит ошибка, верните сообщение об ошибке, если он не вернет пустой errorMessage. Но на данный момент программа, похоже, вообще не выполняет этот метод. Какие-либо предложения?Переменные Java Passing и возвращаемое значение

Вот пример моего кода:

public class Foo { 
    public static void main(String args[]) { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     String order = null; 
     try { 
      order = br.readLine(); 
     } catch (IOException exc) { 
      System.out.println("ERROR: A Problem has occured"); 
     } 

     String[] orderSplit = null; 
     orderSplit = order.split(" "); 

     String errorMessage = ""; 
      checkValue(orderSplit, errorMessage); 
     if (errorMessage == "") { 
      System.out.println("SUCCESS"); 
     } 

    } 
    public static String checkValue(String[] orderSplit, String errorMessage) { 
      // check the ordersplit values 
      return errorMessage; 
    } 
} 

ответ

2

Вы не присвоит результат этого метода ни к чему. Измените свой код на:

String errorMessage = checkValue(orderSplit); 

И не то, чтобы метод checkValue не нуждался в сообщении об ошибке в качестве аргумента. Он будет создавать один сам по себе и вернуть его вызывающему.

Кроме того, назначение нулевой переменной вы переназначить сразу после того, как, например:

String[] orderSplit = null; 
orderSplit = order.split(" "); 

ненужно. Вам просто нужно

String[] orderSplit = order.split(" "); 

И вы никогда не должны сравнивать строки с ==. == проверяет, соответствуют ли две переменные одному и тому же объекту String. Вы должны использовать equals() метод, который проверяет, если две строки содержат ту же самую последовательность символов:

if (errorMessage.equals("")) { 
+0

Спасибо за помощь. Это решило проблему. Теперь, если я определяю кучу переменных в методе checkValue с использованием массива, как передать эти переменные обратно основному методу? Благодарю. – scriptdiddy

+0

В принципе, вы не должны. Метод должен иметь только одну ответственность и как можно меньше побочных эффектов. Если ответственность метода заключается в проверке массива, то он не должен делать ничего другого. Кроме того, если это решило проблему, вы должны перенести и принять ответ. Вот как вы здесь благодарите. –

+0

Голосование требует 15 репутации, которых у меня нет, но я проверяю отмеченные для вас. Благодарю. Поэтому я думаю, мне придется переопределять переменные снова, я просто не хотел быть избыточным. – scriptdiddy

0

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

String errorMessage = ""; 
checkValue(orderSplit, errorMessage); 

в

String errorMessage = ""; 
errorMessage = checkValue(orderSplit, errorMessage); 

Удачи

+0

Существует не один, но это проще понять, почему исходный код не вел ожидания OPs. Я не здесь, чтобы указать на все, что может быть избыточным или не до нуля, с помощью кода людей, но для ответа на поставленный вопрос. –

+1

Достаточно справедливо. Я предпочитаю показывать чистый код новичкам. Я удалил свой комментарий, потому что я не заметил, что OP передал сообщение об ошибке как аргумент метода, который оправдывает назначение значения переменной сначала (хотя передача сообщения совершенно не нужна) –

0

Код выше просто присваивает "" переменной errorMessage и возвращает ссылку на строку "". Это само по себе ничего не делает.

Я предполагаю, что у вас есть код, который присваивает значение errorMessage в методе checkVlaue. Есть некоторые оговорки к этому. Строки неизменны в java. В вашей сигнатуре сообщения передается значение, содержащее ссылку на содержимое errorMessage во время разговора по адресу checkValue. Если вы попытаетесь назначить другое значение этой переменной внутри checkValue и вернуть ее, вы фактически возвращаете значение, которое является ссылкой на другой строковый объект. После того, как вы вернетесь к вызывающему методу, печать errorMessage напечатает "", потому что это строковый объект, который по-прежнему указывает на метод вызова errorMessage. Если вы изменили свой вызов на следующее:

String errorMessage = checkValue(orderSplit); 

Вы сейчас назначая эталонное значение, которое возвращается из checkedValue to ErrorMessage in the calling method. This will now print whatever the result of checkValue` был.

Чистота должна помнить, что даже если большинство вещей в java являются объектными ссылками (указателями), все сигнатуры методов фактически передаются по значению. Когда вы повторно назначаете, вы не изменяете то, на что указывает указатель, а скорее назначают новый указатель на переменную все вместе.

0

java.lang.String является неизменным. Итак, что бы вы ни делали с errorMessage внутри вашего метода, не будет видно вне метода, поскольку по существу вы создаете новые объекты String.

Вы должны действительно проверить возвращаемое значение метода, как предлагают другие ответы.

+0

Тот факт, что присвоение нового значения errorMessage внутри метода не будет иметь никакого влияния на вызывающего, не имеет ничего общего с неизменяемостью. Просто ссылки передаются по значению в Java. –

+0

@JBNizet Я думаю, что он просто указывает, что изменить значение передаваемой информации практически невозможно, независимо от того, как вы это делаете, тогда как можно изменить состояние измененного переданного объекта. –

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