在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Docker 自托管 Jitsi 服务器中为我的 Android 应用程序实现 jwt 令牌韵律插件?

如何在 android 中以编程方式在小米手机安全应用程序中为我的应用程序启用自动启动选项

如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?

如何在 android 中为 TextView 设置字体? [复制]

如何在我的 iphone 中为我的网站添加有效且受信任的安全证书?

如何在 Rails 应用程序中为我的用户添加角色?