简体   繁体   中英

Android app crashing on launch

I'm trying to make a calculator app. First thing first I created a class that will take a string (my equation to solve) and change it from Infix to Postfix. The app is literally bear bones, but when I start it, it crashes immediately, and in the console I get no error. As anyone idea where might be the problem?

The manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.projectcalculator">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

XML file activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.android.projectcalculator.MainActivity">

    <TextView
        android:id="@+id/textCalc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10sp"
        android:layout_weight="1"
        android:text="Hello"/>
</LinearLayout>

The java file MainActivity:

package com.example.android.projectcalculator;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import static android.R.attr.onClick;

import com.example.android.projectcalculator.InfixToPostfix;

public class MainActivity extends AppCompatActivity {

    public TextView calculationText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PrintMainScreen("hello you");
        String s = InfixToPostfix.StartInfixToPostfix("A*(B+C)");
        PrintMainScreen(s);
    }

    public void PrintMainScreen(String str)
    {
        TextView txview = (TextView)findViewById(R.id.textCalc);
        txview.setText(str);
    }
}

The Java file InfiToPostfix:

package com.example.android.projectcalculator;

import java.util.Stack;

public class InfixToPostfix{

    //Varibili private
    private static String postfixOutput;
    private static Stack<Character> operatorStack;
    private static String infixInput;

    //Metodo per controlare se ho a che fare con l'operatore
    private static boolean IsOperator (char c)
    {
        return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '^';
    }

    private static int OpratorPriority(Character operator1)
    {
        switch(operator1)
        {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            case '^':
                return 3;
            default:
                return 0;
        }
    }

    //Metodo Supremo
    public static String StartInfixToPostfix(String in)
    {
        //inizializzo variabili
        postfixOutput = "";
        infixInput.equals(in);
        int lunghezza = infixInput.length();
        operatorStack = new Stack<Character>();

        //inizio il processo
        for (int i=0; i < infixInput.length(); i++)
        {
            //se non è un operatore ma un operando, lo aggiungo alla string di output
            if (!IsOperator(infixInput.charAt(i)))
            {
                postfixOutput += infixInput.charAt(i);
            }
            //Considero il caso in cui sia l'operatore ')'
            else if (infixInput.charAt(i) == ')')
            {
                //Inserisco nel postfix gli operatori fino a che lo sctack è vuoto o incontro una parentesi chiusa
                while (!operatorStack.isEmpty() && operatorStack.peek() != ')')
                {
                    postfixOutput += (operatorStack.pop());
                }
                //elimino la '(' se c'è
                if (!operatorStack.isEmpty())
                {
                    operatorStack.pop();
                }
            }
            //considero il caso in cui ho un operatore che non sia ')'
            else
            {
                //questo while si attiva solo se (1) lo stack non è vuoto (2) l'elemento in cima allo stack non è '(' (3) se l'ultimo operatore ha grado minore
                while ( (!operatorStack.isEmpty()) && (operatorStack.peek() != '(') && (OpratorPriority(operatorStack.peek()) >= OpratorPriority(infixInput.charAt(i))))
                {
                    postfixOutput += operatorStack.pop();
                }
                //aggiungo l'operatore a prescindere di ciò che ho fatto o non fatto con il cilo while
                operatorStack.push(infixInput.charAt(i));
            }
        }

        //Alla fine del metodo rilascio il postfix
        return postfixOutput;
    }
}

Edit: Has anyone idea why I get error if everything in the InfixToPostfix class is not static?

Edit2: Now is giving me this error...

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.android.projectcalculator, PID: 25981
                  Theme: themes:{}
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.projectcalculator/com.example.android.projectcalculator.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5461)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
                      at com.example.android.projectcalculator.InfixToPostfix.StartInfixToPostfix(InfixToPostfix.java:40)
                      at com.example.android.projectcalculator.MainActivity.onCreate(MainActivity.java:20)
                      at android.app.Activity.performCreate(Activity.java:6251)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5461) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

第40行中的infixInput为null,因为未初始化

you should initialize your infixInput variable.

private static String infixInput = "";

Also it seems you wanted to initialize infixInput with in value. Doing infixInput.equals(in) just check if both variables hold same value and do return a boolean.

Then you should do :

infixInput = in.toString()

infixInput.equals(in); is NULL. You have to initialize infixInput first.

String.equals(String) checks if the content of both strings is equal. This doesn't work if one of the Strings is null.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM