2012-06-23 6 views
0

일부 변수를 메서드를 통해 전달한 다음 해당 메서드에서 값을 반환하는 데 문제가 있습니다. checkValue 메서드는 orderSplit 배열의 각 배열 항목을 살펴보고 오류가있는 경우 오류 메시지를 반환하고, 그렇지 않으면 빈 문자 errorMessage을 반환합니다. 그러나 지금 당장은 프로그램이 그 방법을 전혀 실행하지 않는 것처럼 보입니다. 어떤 제안?Java 전달 변수 및 반환 값

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

당신은 아무것도에 대한 방법의 결과를 지정하지 않은 : 여기

내 코드의 예입니다. checkValue 방법은 인수로 오류 메시지를 필요로하지 않습니다

String errorMessage = checkValue(orderSplit); 

그리고하지 :에 코드를 변경합니다. 하나만 만들어서 발신자에게 돌려 보냅니다. 이 같은 직후 재 변수에 null을 할당 또한

:

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

은 필요하지 않습니다. 필요한 것

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

그리고 문자열을 ==과 비교해서는 안됩니다. ==은 두 변수가 동일한 String 객체를 참조하는지 검사합니다. 당신은 그것의 매개 변수를 반환 어디서나 checkValue의 반환 값을 할당하지 않는

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

도움 주셔서 감사합니다. 그것은 그 문제를 해결했습니다. 이제 배열을 사용하여 checkValue 메소드 내에 여러 변수를 정의하면 어떻게 이러한 변수를 main 메소드로 다시 전달할 수 있습니까? 감사. – scriptdiddy

+0

기본적으로, 그렇게해서는 안됩니다. 방법은 단 하나의 책임과 가능한 적은 부작용을 가져야합니다. 메소드의 책임이 배열을 검사하는 것이라면, 다른 일을해서는 안됩니다. 또한 문제가 해결되면 답변을 upvote 받아 받아 들여야합니다. 그것은 당신이 여기에 감사하는 방법입니다. –

+0

투표를 올리려면 내가 갖고 있지 않은 평판이 필요합니다. 그러나 나는 당신에게 그것을 표시했는지 확인합니다. 감사. 그래서 저는 다시 변수를 다시 정의해야 할 것이라고 생각합니다. 단지 중복되지 않기를 바랬습니다. – scriptdiddy

0

: 두 문자열은 문자의 동일한 순서를 포함하는 경우 테스트하는 equals() 방법을 사용해야합니다.

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

행운

+0

원래 코드가 OP에 기대했던대로 작동하지 않는 이유를 쉽게 알 수 있습니다. 나는 중복되거나 또는 사람들의 코드로 긁어 모으지는 않았지만 제기 된 질문에 대답하기 위해 모든 것을 지적하려고 여기에 온 것이 아닙니다. –

+1

충분합니다. 나는 초보자에게 깨끗한 코드를 보여주는 것을 선호한다. OP가 오류 메시지를 메서드에 인수로 전달했음을 알지 못했기 때문에 주석을 제거 했으므로 (메시지 전달은 완전히 필요하지 않지만) 변수에 값을 먼저 할당하는 것을 정당화합니다. –

0

위의 코드는 바로 errorMessage 변수에 ""를 할당하고 문자열 ""에 대한 참조를 반환에

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

을 변경해보십시오. 이것 자체는 아무것도하지 않습니다.

나는 checkVlaue 방법에 다른 값을 할당하는 코드가 있다고 가정합니다. 이에 대한 몇 가지주의 사항이 있습니다. 문자열은 java에서 불변입니다. 메시지 서명에서 전달되는 값은 checkValue 호출시 errorMessage의 내용에 대한 참조를 포함하는 값입니다. checkValue 안에이 변수에 다른 값을 할당하려고 시도하면 실제로 다른 문자열 객체에 대한 참조 값을 반환합니다. 호출 메서드로 돌아 가면 errorMessage은 호출 메서드의 errorMessage이 여전히 가리키는 문자열 개체이기 때문에 ""을 인쇄합니다.

String errorMessage = checkValue(orderSplit); 

는 이제 in the calling method. This will now print whatever the result of checkValue`이었다 checkedValue to ERRORMESSAGE에서 반환 된 참조 값을 할당되어 다음에 전화를 변경 한 경우.

Java에서 대부분의 것들이 모든 메소드 서명이 실제로 값에 의해 전달되는 객체 참조 (포인터)이지만 기억해야합니다. 다시 할당 할 때 포인터가 가리키는 점을 변경하지 않고 변수에 새 포인터를 모두 할당합니다.

0

java.lang.String은 변경할 수 없습니다. 따라서 메소드 내부에있는 errorMessage에 대한 작업은 메소드 외부에 표시되지 않습니다. 본질적으로 새 String 객체를 생성하고 있기 때문입니다.

다른 답변에서 제안하는대로 메서드의 반환 값을 확인해야합니다.

+0

errorMessage에 새 값을 할당한다는 사실 메서드 내에서 호출자에 아무런 영향을 미치지 않습니다. Java에서 참조가 값으로 전달된다는 것입니다. –

+0

@JBNizet 저는 전달 된 값을 변경하는 것은 문자 그대로 불가능하다는 것을 지적하고 있다고 생각합니다. 변경 가능한 객체의 상태를 수정할 수있는 반면에, 전달 된 값은 변경할 수 없습니다. –