0

일부 정보를 수신하는 데 사용하는 방법이 있습니다. 이런 방식으로 한 문자열 (서버 방향) 및 사용자 패스워드를 포함 두 문자열을 전송하고, I는 []를 모든 정보,하지만create()에서 null 포인터 예외가 발생했습니다.

values = request("http://myIp/XXX/post.php?request=1", user, password); 

라인에서 NullPointerException이있는 문자열받을 . "

@SuppressWarnings("null") 
public String[] request(String requesturl, String user, String password) 
{ 
    String result[] = null; 

    try 
    { 
     HttpClient httpclient = new DefaultHttpClient(); 

     HttpPost httppost = new HttpPost(requesturl); 

     String results = ""; 

     //Varibles POST 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
     nameValuePairs.add(new BasicNameValuePair("user", user)); 
     nameValuePairs.add(new BasicNameValuePair("password", password));       

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     //Execute HTTP Post Request 
     HttpResponse response = httpclient.execute(httppost); 
     response.getAllHeaders(); 
     response.getEntity(); 
     result[0] = "";                   
     if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) 
     { 
      results = EntityUtils.toString(response.getEntity());   
      if(!results.equals("-1")) 
      { 
       JSONObject jsonResponse = new JSONObject(results); 

       JSONArray jsonMainNode = jsonResponse.optJSONArray("edificios"); 

       int lengthJsonArr =jsonMainNode.length(); 
       for(int i = 0; i < lengthJsonArr; i++) 
       { 
        JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
        result[i] = jsonChildNode.optString("nombre"); 
       } 
      }     
     } 

     return result; 
    } 
    catch(Exception ex) 
    { 
     result[0] = "error"; 
     return result; 
    } 
} 

내가"= 요청 값 ("....);"온 NullPointerException이 받았다 :

String[] values; 

@SuppressLint("InlinedApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE); 
    setContentView(R.layout.activity_select_environment); 

    myBundle = getIntent().getExtras(); 

    user = myBundle.getString("user"); 
    password = myBundle.getString("password"); 

    values = request("http://myIp/XXX/post.php?request=1", user, password); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, android.R.id.text1, values); 
} 

방법은 다음이다 : 완전한 코드 옆 라인과 나는 왜 그런지 모르겠다. 왜냐하면 사용자와 패스워드는 값을 가지고 있고 다른 값은 문자열이기 때문이다. 무엇을 할 수 있을까?

+5

'@SuppressWarnings는 ("널 (null)")'당신이 당신의 문제에 대해 경고 컴파일러를 무시하기로 결정했습니다 나타냅니다. 그것을 제거하고 문제를 해결하십시오. 힌트 :'result'는 초기화되지 않았습니다. 적어도 로깅/재실행 없이는 예외를 잡아서는 안됩니다. – laalto

+0

logcat 로그 게시 – kiruwka

+0

고양이 로그 편집 –

답변

4

result 문자열 배열을 선언했지만 초기화하지 않았습니다.

이 시도 :

@SuppressWarnings("null") 
public String[] request(String requesturl, String user, String password) 
{ 
    String result[] = new String[ <Insert value> ]; 
    // Code... 
} 

날 downvotes을 방지하기 위해 더 설명해 보자. 이것이 내가 생각하는 이유입니다 :

먼저 배열을 null로 초기화하므로 아직 사용할 수 없습니다. 더 아래 라인이 String results = "" 있지만 귀하의 배열은 아직 null입니다. 그럼 당신이 할 result[0] = "", 오 이런. 그것이 nullPointerException이 나오는 곳입니다.

배열을 초기화해야하며 어레이의 크기를 먼저 알아야한다고 말하면 맞는 말이됩니다. 크기에 예상되는 최대 값을 사용하거나 이 아닌 list을 사용하는 것이 더 좋습니다.

list 데이터 구조에 대한 유용한 정보는 List in Android Development입니다.

listarrayshere에 대한 좋은 토론이 있는데, 그것은 C#이지만 원칙은 다소 차이가 없습니다.

+0

그러나 문자열 결과 []의 크기를 알지 못합니다. 사용하는 경우 크기를 지정해야하며 크기가 무엇인지 모릅니다. 그렇습니까? – Imrik

+3

@Imrik 그런 다음 목록을 사용하십시오. –

+0

@Imrik 탐색 할 두 가지 소스를 추가 했으므로 필요한 솔루션을 제공해야합니다. –

0

You got the exception because you are trying to access the first element of the 결과 , which is not even initialized.

그래서 먼저 배열을 초기화하고 배열의 크기를 미리 알고 있지 않은 경우 그것을

result = new String[<some size>]; 

를 사용할 필요가 다음 ArrayList 당신을위한 옵션이 될 수 있습니다.

ArrayList<String> result = new ArrayList<>(); 

사용

result.add(<some string value>); 
관련 문제