【问题标题】:java.lang.RuntimeException: Unable to start activity ComponentInfo in Androidjava.lang.RuntimeException:无法在 Android 中启动活动 ComponentInfo
【发布时间】:2013-03-23 00:46:22
【问题描述】:

我正在尝试解析此网站中的 JSON 对象值。但是我得到运行时错误:无法启动活动组件信息:url 中的非法字符。 这是我的代码:

public class MainActivity extends ListActivity {
    private static final String TAG_ROWS = "row";
    private static final String TAG_ELEMENTS = "elements";
    private static final String TAG_DISTANCE = "distance";
    private static final String TAG_VALUE = "value";
    private static final String TAG_ADDRESS = "destination_addresses";
    String data;
    HttpClient client; 
    double minDistance=0;
    static JSONObject jObj = null;
    String destination_addresses;
    JSONArray rows;
    JSONArray elements;
    String value;
    final static String URL= "http://maps.googleapis.com/maps/api/distancematrix/json?";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            try {
                ClosestObject();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        finally {

        }
        setContentView(R.layout.activity_main);
        TextView result = (TextView) findViewById(R.id.text1);
            result.setText(data);

    }



public void ClosestObject () throws JSONException, ClientProtocolException, IOException {

        // Creating JSON Parser instance
    String param= "origins=Vancouver+BC&destinations=burnaby|Victoria+BC|Surrey+BC&mode=driving&language=en-FR&sensor=false";
    String encodedparams = URLEncoder.encode(param,"UTF-8");
    String FinalUrl= URL +encodedparams;
    StringBuilder url = new StringBuilder(FinalUrl);

   HttpGet get = new HttpGet(url.toString());

    HttpResponse r = client.execute(get);
    HttpEntity en = r.getEntity();
    data = EntityUtils.toString(en);
    jObj = new JSONObject(data);


        try {


            rows = jObj.getJSONArray(TAG_ROWS);
            elements = rows.getJSONArray(0);
            for (int i=0; i<elements.length();i++){
                 JSONObject obj = elements.getJSONObject(i);
                 JSONObject distance = obj.getJSONObject(TAG_DISTANCE);
                  value= distance.getString(TAG_VALUE);
                  double distanceValue = Double.parseDouble(value);
                  if ( distanceValue < minDistance){
                      minDistance = distanceValue;
                  }
            }

         }  
        catch (JSONException e) {
            e.printStackTrace();
        }

 }



@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

这是错误: 04-01 21:06:05.734: D/AndroidRuntime(1045): 关闭 VM 04-01 21:06:05.734: W/dalvikvm(1045): threadid=1: 线程以未捕获的异常退出 (group=0x40a71930) 04-01 21:06:05.764:E/AndroidRuntime(1045):致命异常:主要 04-01 21:06:05.764: E/AndroidRuntime(1045): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.distance/com.example.distance.MainActivity}: java.lang.IllegalArgumentException: 非法索引 97 处查询中的字符:http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC&destinations=burnaby|Victoria+BC|Surrey+BC&mode=driving&language=en-FR&sensor=falsehttp://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC&destinations=burnaby|Victoria+BC|Surrey+BC&mode=driving&language=en-FR&sensor=false 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.os.Handler.dispatchMessage(Handler.java:99) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.os.Looper.loop(Looper.java:137) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.ActivityThread.main(ActivityThread.java:5041) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 java.lang.reflect.Method.invokeNative(Native Method) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 java.lang.reflect.Method.invoke(Method.java:511) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-01 21:06:05.764: E/AndroidRuntime(1045): at dalvik.system.NativeStart.main(Native Method) 04-01 21:06:05.764:E/AndroidRuntime(1045):原因:java.lang.IllegalArgumentException:索引 97 处查询中的非法字符:http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC&destinations=burnaby|Victoria+BC|Surrey+BC&mode=driving&language=en-FR&sensor=falsehttp://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC&destinations=burnaby|Victoria+BC|Surrey+BC&mode=driving&language=en-FR&sensor=false 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 java.net.URI.create(URI.java:727) 04-01 21:06:05.764: E/AndroidRuntime(1045): at org.apache.http.client.methods.HttpPost.(HttpPost.java:79) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 com.example.distance.MainActivity$JSONParser.getJSONFromUrl(MainActivity.java:68) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 com.example.distance.MainActivity.ClosestObject(MainActivity.java:115) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 com.example.distance.MainActivity.onCreate(MainActivity.java:44) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.Activity.performCreate(Activity.java:5104) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 04-01 21:06:05.764: E/AndroidRuntime(1045): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 04-01 21:06:05.764: E/AndroidRuntime(1045): ... 11 更多

我非常感谢你帮助我:)

【问题讨论】:

    标签: java android xml json runtime-error


    【解决方案1】:

    IllegalArgumentException:查询中的非法字符

    表示您没有以正确的格式传递带有 url 的查询字符串(参数)。在附加到 URL 之前,使用 URLEncoder.encode 对特殊字符进行编码。

    示例:

    String str_url="http://www.xxxxxx.com?";
    String str_parameters = "param123=abc|test&param=abc test";
    String encodedparams = URLEncoder.encode(str_parameters,"UTF-8");
    
    String str_finalurl=str_url+encodedparams;
    

    【讨论】:

    • 但这是一个正确的链接你maps.googleapis.com/maps/api/distancematrix/…
    • @KarleeB :首先使用 HttpGet 而不是 HttpPost,因为当前请求是 get 而不是 post
    • @KarleeB : 请用最新的代码编辑你的帖子,然后我会尽力帮助你
    • @KarleeB : 在当前代码中我看不到 URLEncoder.encode ?
    • 谢谢你UUUUUUUUUUUUUUUUUUUUUU
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多