LoginActivity中85行数组越界,提示很明确:总长度才1,却取到index107-08 10:30:19.604: E/AndroidRuntime(567): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
07-08 10:30:19.604: E/AndroidRuntime(567): at com.amaker.wlo.LoginActivity.saveUserMsg(LoginActivity.java:85)

解决方案 »

  1.   

    package com.amaker.wlo;import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;import com.amaker.util.HttpUtil;public class LoginActivity extends Activity {
    // 声明登录、取消按钮
    private Button cancelBtn,loginBtn;
    // 声明用户名、密码输入框
    private EditText userEditText,pwdEditText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 设置标题
    setTitle("掌中宝无线订餐系统-用户登录");
    // 设置当前Activity界面布局
    setContentView(R.layout.login_system);
    // 通过findViewById方法实例化组件
    cancelBtn = (Button)findViewById(R.id.cancelButton);
    // 通过findViewById方法实例化组件
    loginBtn = (Button)findViewById(R.id.loginButton);
    // 通过findViewById方法实例化组件
    userEditText = (EditText)findViewById(R.id.userEditText);
    // 通过findViewById方法实例化组件
    pwdEditText = (EditText)findViewById(R.id.pwdEditText);

    cancelBtn.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
    finish();
    }
    });

    loginBtn.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
    if(validate()){
    if(login()){
    Intent intent = new Intent(LoginActivity.this,MainMenuActivity.class);
    startActivity(intent);
    }else{
    showDialog("用户名称或者密码错误,请重新输入!");
    }
    }
    }
    });
    }
    // 登录方法
    private boolean login(){
    // 获得用户名称
    String username = userEditText.getText().toString();
    // 获得密码
    String pwd = pwdEditText.getText().toString();
    // 获得登录结果
    String result=query(username,pwd);
    if(result!=null&&result.equals("0")){
    return false;
    }else{
    saveUserMsg(result);
    return true;
    }
    }

    // 将用户信息保存到配置文件
    private void saveUserMsg(String msg){
    // 用户编号
    String id = "";
    // 用户名称
    String name = "";
    // 获得信息数组
    String[] msgs = msg.split(";");
    int idx = msgs[0].indexOf("=");
    id = msgs[0].substring(idx+1);
    idx = msgs[1].indexOf("=");
    name = msgs[1].substring(idx+1);
    // 共享信息
    SharedPreferences pre = getSharedPreferences("user_msg", MODE_WORLD_WRITEABLE);
    SharedPreferences.Editor editor = pre.edit();
    editor.putString("id", id);
    editor.putString("name", name);
    editor.commit();
    }

    // 验证方法
    private boolean validate(){
    String username = userEditText.getText().toString();
    if(username.equals("")){
    showDialog("用户名称是必填项!");
    return false;
    }
    String pwd = pwdEditText.getText().toString();
    if(pwd.equals("")){
    showDialog("用户密码是必填项!");
    return false;
    }
    return true;
    }
    private void showDialog(String msg){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(msg)
           .setCancelable(false)
           .setPositiveButton("确定", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
    }
    // 根据用户名称密码查询
    private String query(String account,String password){
    // 查询参数
    String queryString = "account="+account+"&password="+password;
    // url
    String url = HttpUtil.BASE_URL+"servlet/LoginServlet?"+queryString;
    // 查询返回结果
    return HttpUtil.queryStringForPost(url);
        }
    }
    程序源代码,求大神帮忙,书上抄的,但是运行总是出现上面的报错
      

  2.   


    // 根据用户名称密码查询
    private String query(String account,String password){
    // 查询参数
    String queryString = "account="+account+"&password="+password;
    // url
    String url = HttpUtil.BASE_URL+"servlet/LoginServlet?"+queryString;
    // 查询返回结果
    return HttpUtil.queryStringForPost(url);
      }这一段,你的程序中有LoginServlet这个Servlet么?如果没有,肯定不行啊,如果有的话,看看返回的String有没有这个分号 ;  因为这里拆分的时候就用分号的// 获得信息数组
    String[] msgs = msg.split(";");
      

  3.   

    数组越界,应该是你的返回数据有问题,解析的时候,只解析出一部分,可以log后者debug看一下返回的数据
      

  4.   

    数组索引超出范围,截取的时候字符串里可能没有你那个分隔符,第一,你可以分割的时候验证一下,第二,可以给你的数组默认一个数值,这样,至少不会报错,然后debug看看,到底是哪个地方数据格式不对就好。android技术群:237305376,新群人不多,欢迎大家的加入~
      

  5.   

    貌似不是越界啊,数组更改过了还不行,Debug结果this LoginActivity  (id=830022674824)
    id "网络异常!" (id=830026090968)
    idx -1
    msgs String[1]  (id=830026091240)
    name "" (id=830012502784)
    count 0
    hashCode 0
    offset 0
    value  (id=830012502816)
    msg "网络异常!" (id=830026090968)
    count 5
    hashCode 1027227840
    offset 0
    value  (id=830026091000)
    以下是我的mySql数据库链接,是不是填错了呢,本机运行安卓链接mySql数据库地址有什么格式没,谢谢大家啦
    public static final String BASE_URL="http://192.168.1.104:8080/mysql/";
      

  6.   


    private void saveUserMsg(String msg){  把这个msg打印下,不就明了了么
      

  7.   

    07-11 13:01:25.616: E/AndroidRuntime(581): FATAL EXCEPTION: main
    07-11 13:01:25.616: E/AndroidRuntime(581): java.lang.NullPointerException
    07-11 13:01:25.616: E/AndroidRuntime(581):  at com.amaker.wlo.LoginActivity.login(LoginActivity.java:67)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at com.amaker.wlo.LoginActivity.access$1(LoginActivity.java:60)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at com.amaker.wlo.LoginActivity$2.onClick(LoginActivity.java:49)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at android.view.View.performClick(View.java:3480)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at android.view.View$PerformClick.run(View.java:13983)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at android.os.Handler.handleCallback(Handler.java:605)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at android.os.Handler.dispatchMessage(Handler.java:92)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at android.os.Looper.loop(Looper.java:137)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at android.app.ActivityThread.main(ActivityThread.java:4340)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at java.lang.reflect.Method.invokeNative(Native Method)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at java.lang.reflect.Method.invoke(Method.java:511)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    07-11 13:01:25.616: E/AndroidRuntime(581):  at dalvik.system.NativeStart.main(Native Method)
    还是有问题啊
      

  8.   

    LoginActivity.java 第67行出错,空指针,把LoginActivity.java的源码发上来看看
      

  9.   

    出错应该是userEditText.getText()或者pwdEditText.getText()的值为空,可将以下2行代码改一下String username = userEditText.getText().toString();
    String pwd = pwdEditText.getText().toString();改成:
    String username = null;
    String pwd = null;
    if(userEditText!=null && userEditText.getText()!=null)
    {
    username = userEditText.getText().toString();
    }
    if(pwdEditText!=null && pwdEditText.getText()!=null)
    {
    pwd = pwdEditText.getText().toString();
    }