在 Android 中为我的应用程序抛出 IllegalStateException

Posted

技术标签:

【中文标题】在 Android 中为我的应用程序抛出 IllegalStateException【英文标题】:IllegalStateException thrown for my app in Android 【发布时间】:2016-05-12 05:49:02 【问题描述】:

所以我的第一部分登录工作正常。没有问题。现在,当我尝试使用相同的应用程序进行注册时,它就停止了工作。我迷路了,我是android开发的新手,所以我不太明白给出的错误。

MainActivity.java

   public class MainActivity extends AppCompatActivity 
    EditText UsernameEt, PasswordEt;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        UsernameEt = (EditText) findViewById(R.id.etUserName);
        PasswordEt = (EditText) findViewById(R.id.etPassword);

    

    public void OnLogin(View view)
        String username = UsernameEt.getText().toString();
        String password = PasswordEt.getText().toString();
        String type = "login";

        BackgroundWorker backgroundWorker = new BackgroundWorker(this);

        backgroundWorker.setOnTaskFinishedListener(new BackgroundWorker.OnTaskFinishedListener() 

            @Override
            public void onTaskFinished(String result) 
                // Now you have the result of your login here.
                // Result should be "admin", "user", or "failed"
                // You can now create an intent and open the page
                // to your next activity.
                switch (result) 
                    case "admin":
                        // Create your intent.
                        Intent adminIntent = new Intent(MainActivity.this, AdminPageActivity.class);
                        // Start the admin page activity.
                        startActivity(adminIntent);
                        break;

                    case "user":
                        // Create your intent.
                        Intent userIntent = new Intent(MainActivity.this, UserPageActivity.class);
                        // Start the user page activity.
                        startActivity(userIntent);
                        break;

                    default:
                        // Login failed.
                        Intent failIntent  = new Intent(MainActivity.this, MainActivity.class);
                        startActivity(failIntent);
                        break;
                
            
        );

        backgroundWorker.execute(type, username, password);
    

    public void openRegistration(View view)
        startActivity(new Intent(this, Registration.class));
    

Registration.java

public class Registration extends AppCompatActivity 
    EditText NameEt, RoleEt, UsernameEt, PasswordEt;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registration);

        NameEt = (EditText) findViewById(R.id.etName);
        UsernameEt = (EditText) findViewById(R.id.etUserName);
        PasswordEt = (EditText) findViewById(R.id.etPassword);
        RoleEt = (EditText) findViewById(R.id.etRole);
    

    public void OnRegister(View view) 
        String str_name = NameEt.getText().toString();
        String str_username = UsernameEt.getText().toString();
        String str_password = PasswordEt.getText().toString();
        String str_role = RoleEt.getText().toString();
        String type = "register";

        BackgroundWorker backgroundWorker = new BackgroundWorker(this);
        backgroundWorker.execute(type, str_name, str_username, str_password, str_role);
    


BackgroundWorker.java

public class BackgroundWorker extends AsyncTask<String,Void,String> 
    Context context;
    AlertDialog alertDialog;
    BackgroundWorker (Context ctx) 
        context = ctx;
    

    @Override
    protected String doInBackground(String... params) 
        String type = params[0];
        String login_url = "http://ipaddress/folder/login.php";
        String register_url = "http://ipaddress/folder/register.php";
        if(type.equals("login")) 
            try 
                String user_name = params[1];
                String password = params[2];
                URL url = new URL(login_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                String post_data = URLEncoder.encode("user_name","UTF-8")+"="+URLEncoder.encode(user_name,"UTF-8") +"&" + URLEncoder.encode("password","UTF-8") + "=" + URLEncoder.encode(password,"UTF-8");
                bufferedWriter.write(post_data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
                String result="";
                String line="";
                while((line = bufferedReader.readLine())!= null) 
                    result += line;
                
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return result;
             catch (MalformedURLException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
            
         else if(type.equals("register")) 
            try 
                String name = params[1];
                String username = params[2];
                String password = params[3];
                String role = params[4];
                URL url = new URL(register_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                String post_data = URLEncoder.encode("name", "UTF-8") + "=" + URLEncoder.encode(name,"UTF-8") + "&" + URLEncoder.encode("username", "UTF-8")+"="+URLEncoder.encode(username,"UTF-8") + "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password,"UTF-8") + "&" + URLEncoder.encode("role","UTF-8") + "=" + URLEncoder.encode(role,"UTF-8");
                bufferedWriter.write(post_data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
                String result="";
                String line="";
                while((line = bufferedReader.readLine())!= null) 
                    result += line;
                
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return result;
             catch (MalformedURLException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
            
        
        return null;
    

    public interface OnTaskFinishedListener 
        void onTaskFinished(String result);
    

    // Member property to reference listener.
    private OnTaskFinishedListener mOnTaskFinishedListener;

    // Setter for listener.
    public void setOnTaskFinishedListener(OnTaskFinishedListener listener) 
        mOnTaskFinishedListener = listener;
    

    @Override
    protected void onPreExecute() 
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Login Status");
    

    @Override
    protected void onPostExecute(String result) 
        alertDialog.setMessage(result);
        alertDialog.show();

        switch (result) 
            case "failed":
                // Login failed.
                break;
            case "user": // Login successful, result (role) is "user"
                result = "user";
                break;
            case "admin": // Login successful, result (role) is "admin"
                result = "admin";
                break;
        

        if (mOnTaskFinishedListener != null) 
            mOnTaskFinishedListener.onTaskFinished(result);
        
    

    @Override
    protected void onProgressUpdate(Void... values) 
        super.onProgressUpdate(values);
    

我刚刚添加了另一个if else 以在backgroundworker.java 上注册。

register.php

<?php 

require "conn.php";

$name = $_POST["name"];
$username = $_POST["username"];
$password = $_POST["password"];
$role = $_POST["role"];


$mysql_qry = "insert into  employee_data (name, username, password, role)  values ('$name', '$username', '$password', '$role')";

if($conn->query($mysql_qry) === TRUE)
    echo "success";

else 
    echo "fail".$mysql_qry."<br>".$conn->error;

$conn->close();

?>

我被困在这里,请帮忙。

错误日志

Process: com.example.user.mysqldemo, PID: 1325
java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
        at android.view.View.performClick(View.java:4438)
        at android.view.View$PerformClick.run(View.java:18422)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.NullPointerException
        at com.example.user.mysqldemo.Registration.OnRegister(Registration.java:28)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

6.Activity_registration.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_
android:layout_
android:padding="10dp">

<TextView
    android:layout_
    android:text="Name"
    android:layout_ />

<EditText
    android:id="@+id/etName"
    android:layout_
    android:layout_
    android:layout_marginBottom="10dp"/>

<TextView
    android:layout_
    android:text="Username"
    android:layout_ />

<EditText
    android:id="@+id/etUsername"
    android:layout_
    android:layout_
    android:layout_marginBottom="10dp"/>

<TextView
    android:layout_
    android:text="Password"
    android:layout_ />

<EditText
    android:id="@+id/etPassword"
    android:layout_
    android:inputType="textPassword"
    android:layout_
    android:layout_marginBottom="10dp"/>

<TextView
    android:layout_
    android:text="Role"
    android:layout_ />

<EditText
    android:id="@+id/etRole"
    android:layout_
    android:layout_
    android:layout_marginBottom="10dp"/>

<Button
    android:id="@+id/bRegister"
    android:text="Register"
    android:layout_
    android:layout_
    android:onClick="OnRegister"/>

【问题讨论】:

请记录您遇到的错误 请发布你的日志 刚刚编辑了错误。不知道如何将其放入***的格式。对此感到抱歉 没关系。那么哪一行是 28,哪个变量是 null?调试器会显示它 在registration.java第28行是String str_username = UsernameEt.getText().toString(); 【参考方案1】:

当您添加android:onClick 属性时,您还必须创建widget clickable。将 xml 更新为

<Button
    android:id="@+id/bRegister"
    android:text="Register"
    android:layout_
    android:layout_
    android:clickable="true"
    android:onClick="OnRegister"/>

希望这会有所帮助。

更新 这行UsernameEt = (EditText) findViewById(R.id.etUserName); 是罪魁祸首,因为register_activity xml 不包含id etUserName。它指向其他一些 xml,而不是这个 xml 包含这个 id etUsername

【讨论】:

awww.. 你让我激动了一会儿。但不幸的是。它仍然停止工作..让我又伤心了..哈哈。不过还是不错的。 你看到更新的答案了吗? etUserName 应该是 etUsername,因为活动注册 xml 不包含 etUserName ooooo... 我没有意识到您更新了您的答案.. 我之前正在做 xml 文件.. 大声笑.. 现在一切正常。 tqvm 的帮助.. 现在我为弄乱大小写感到愚蠢.. demit.. tq 再次..

以上是关于在 Android 中为我的应用程序抛出 IllegalStateException的主要内容,如果未能解决你的问题,请参考以下文章