有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android EditText到int会话错误

这可能是问得最多的问题,但很难找到答案。首先我是新手。我想做一个简单的二次方程公式应用程序。这将使我们能够快速找到解决方案。我碰到一个问题,Android Studio说代码没问题,但在打开应用程序后设备崩溃了

private Button   mButton;
private EditText mEdit;
private EditText mEdit1;
private EditText mEdit2;
private TextView mText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mButton = (Button)findViewById(R.id.button2);
    mEdit   = (EditText)findViewById(R.id.editText);
    mEdit1   = (EditText)findViewById(R.id.editText2);
    mEdit2   = (EditText)findViewById(R.id.editText3);
    mText = (TextView)findViewById(R.id.textView4);

    //Int definēšana
    final int i1 = Integer.parseInt(mEdit.getText().toString());
    final int i2 = Integer.parseInt(mEdit1.getText().toString());
    final int i3 = Integer.parseInt(mEdit2.getText().toString());

    mButton.setOnClickListener(
            new View.OnClickListener()
            {
                public void onClick(View view)
                {
                    //Mainīgo ievade
                    int a = i1;
                    //Pārbauda vai a nav nulle
                    if (a == 0){
                        mText.setText(String.valueOf("Nav kvadrātvienādojums"));
                    } else {
                        int b = i2;
                        int c = i3;

                        //Diskriminanta aprēķināšana
                        double diskr = (b*b)-4*a*c;
                        //Kvadrātsakne no diskriminanta
                        double sd = (double) Math.sqrt(diskr);
                        //Sakņu aprēķināšana
                        double x1 = (-b+sd)/(2*a);
                        double x2 = (-b-sd)/(2*a);

                        //Rezultāta izvade
                        if (diskr < 0){
                            mText.setText(String.valueOf("Kvadrātvienādojumam nav sakņu"));
                        } else if (diskr == 0){
                            mText.setText(String.valueOf("Kvadrātvienādojumam ir viena sakne: " + x1));
                        } else {
                            mText.setText(String.valueOf("Kvadrātvienādojuma saknes: " + x1 + " un " + x2));
                        }
                    }
                }
            });
} 

以及可能有助于检测问题的logcat

FATAL EXCEPTION: main
Process: com.homemade.prtbust.kvadratvienadojums, PID: 4552
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.homem`enter code here`ade.prtbust.kvadratvienadojums/com.homemade.prtbust.kvadratvienadojums.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method '安卓.text.Editable 安卓.widget.EditText.getText()' on a null object reference
at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3133)
at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3243)
at 安卓.app.ActivityThread.access$1000(ActivityThread.java:218)
at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1718)
at 安卓.os.Handler.dispatchMessage(Handler.java:102)
at 安卓.os.Looper.loop(Looper.java:145)
at 安卓.app.ActivityThread.main(ActivityThread.java:6917)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method '安卓.text.Editable 安卓.widget.EditText.getText()' on a null object reference
    at com.homemade.prtbust.kvadratvienadojums.MainActivity.onCreate(MainActivity.java:38)
    at 安卓.app.Activity.performCreate(Activity.java:6609)
    at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)
    at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3086)
    at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3243)
    at 安卓.app.ActivityThread.access$1000(ActivityThread.java:218)
    at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1718)
    at 安卓.os.Handler.dispatchMessage(Handler.java:102)
    at 安卓.os.Looper.loop(Looper.java:145)
    at 安卓.app.ActivityThread.main(ActivityThread.java:6917)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404
    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

共 (3) 个答案

  1. # 1 楼答案

    您没有为活动分配任何布局,因此您的所有编辑文本、按钮和文本视图都不存在,当您试图通过代码访问其中任何一个时,程序将崩溃

    其次,您应该在单击按钮时读取变量的值,而不是在oncreate中,因为这将导致另一个错误,因为您将尝试解析空字符串(除非您在xml中的android:text标记中设置了值)。 我也不会宣布它们为最终版本(因为以后您将无法修改它们)

    尝试使用以下代码:

    private Button   mButton;
    private EditText mEdit;
    private EditText mEdit1;
    private EditText mEdit2;
    private TextView mText;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button)findViewById(R.id.button2);
        mEdit   = (EditText)findViewById(R.id.editText);
        mEdit1   = (EditText)findViewById(R.id.editText2);
        mEdit2   = (EditText)findViewById(R.id.editText3);
        mText = (TextView)findViewById(R.id.textView4);
    
        mButton.setOnClickListener(
                new View.OnClickListener()
                {
                    public void onClick(View view)
                    {
                        //Int definēšana
                        int i1 = Integer.parseInt(mEdit.getText().toString());
                        int i2 = Integer.parseInt(mEdit1.getText().toString());
                        int i3 = Integer.parseInt(mEdit2.getText().toString());
    
                        //Mainīgo ievade
                        int a = i1;
                        //Pārbauda vai a nav nulle
                        if (a == 0){
                            mText.setText(String.valueOf("Nav kvadrātvienādojums"));
                        } else {
                            int b = i2;
                            int c = i3;
    
                            //Diskriminanta aprēķināšana
                            double diskr = (b*b)-4*a*c;
                            //Kvadrātsakne no diskriminanta
                            double sd = (double) Math.sqrt(diskr);
                            //Sakņu aprēķināšana
                            double x1 = (-b+sd)/(2*a);
                            double x2 = (-b-sd)/(2*a);
    
                            //Rezultāta izvade
                            if (diskr < 0){
                                mText.setText(String.valueOf("Kvadrātvienādojumam nav sakņu"));
                            } else if (diskr == 0){
                                mText.setText(String.valueOf("Kvadrātvienādojumam ir viena sakne: " + x1));
                            } else {
                                mText.setText(String.valueOf("Kvadrātvienādojuma saknes: " + x1 + " un " + x2));
                            }
                        }
                    }
                });
    } 
    
  2. # 2 楼答案

    我想你错过了

    setContentView(R.layout.activity_main);“activity_name是布局的名称,其中是编辑文本”

    在使用findViewById之前必须调用setContentView

  3. # 3 楼答案

    在设置活动的内容视图后,请尝试编写此代码

        //load all the views from the xml file
        setContentView(R.layout.activity_main);
    
    mButton = (Button)findViewById(R.id.button2);
    mEdit   = (EditText)findViewById(R.id.editText);
    mEdit1   = (EditText)findViewById(R.id.editText2);
    mEdit2   = (EditText)findViewById(R.id.editText3);
    mText = (TextView)findViewById(R.id.textView4);
    
    //Int definēšana
    final int i1 = Integer.parseInt(mEdit.getText().toString());
    final int i2 = Integer.parseInt(mEdit1.getText().toString());
    ...
    
        mButton.setOnClickListener(/*your code here*/);
    

    在创建EditText视图之前,无法从EditText获取文本。 如果这并没有解决你的问题,试着在onStart上写下你的i1/2/3变量

    @Override
    protected void onStart() {
        super.onStart();
    
        final int i1 = Integer.parseInt(mEdit.getText().toString());
        final int i2 = Integer.parseInt(mEdit1.getText().toString());
        final int i3 = Integer.parseInt(mEdit2.getText().toString());
    }