Я не могу оценить строку с помощью eval () - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь создать приложение для калькулятора. Я хочу оценить содержимое TextView и отобразить его в виде всплывающего сообщения. Оператор eval () генерирует исключение для ScriptException, как показано ниже.

"Unhandled exception: javax.script.ScriptException" 

Даже когда я импортировал javax.script.ScriptException. Я не понимаю, почему это исключение.

Вот мой код xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:layout_marginTop="95dp"
            android:textAlignment="center"
            android:textSize="36sp" />

        <Button
            android:id="@+id/n1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="18dp"
            android:layout_marginTop="194dp"
            android:text="1" />

        <Button
            android:id="@+id/n2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/n1"
            android:layout_centerHorizontal="true"
            android:text="2" />

        <Button
            android:id="@+id/n3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignTop="@+id/n1"
            android:layout_marginEnd="16dp"
            android:text="3" />

        <Button
            android:id="@+id/n4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/n1"
            android:layout_centerVertical="true"
            android:text="4" />

        <Button
            android:id="@+id/n5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="5" />

        <Button
            android:id="@+id/n6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/n3"
            android:layout_centerVertical="true"
            android:text="6" />

        <Button
            android:id="@+id/n7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignStart="@+id/n1"
            android:layout_marginBottom="194dp"
            android:text="7" />

        <Button
            android:id="@+id/n8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/n7"
            android:layout_centerHorizontal="true"
            android:text="8" />

        <Button
            android:id="@+id/n9"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/n3"
            android:layout_alignTop="@+id/n7"
            android:text="9" />

        <Button
            android:id="@+id/n0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="129dp"
            android:text="0" />

        <Button
            android:id="@+id/clear"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/n3"
            android:layout_alignTop="@+id/n0"
            android:text="CLEAR" />

        <Button
            android:id="@+id/plus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="73dp"
            android:text="+" />

        <Button
            android:id="@+id/equal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/n3"
            android:layout_alignTop="@+id/plus"
            android:text="=" />

    </RelativeLayout>

</android.support.constraint.ConstraintLayout>

и вот мой код Java:

package com.example.poopypigeon.calx;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class MainActivity extends AppCompatActivity {
    Button n1;
    Button n2;
    Button n3;
    Button n4;
    Button n5;
    Button n6;
    Button n7;
    Button n8;
    Button n9;
    Button n0;
    Button clear;
    Button plus;
    Button equal;
    TextView value;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        value = findViewById(R.id.textView);
        n1 = findViewById(R.id.n1);
        n1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"1");
            }
        });
        n2 = findViewById(R.id.n2);
        n2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"2");
            }
        });
        n3 = findViewById(R.id.n3);
        n3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"3");
            }
        });
        n4 = findViewById(R.id.n4);
        n4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"4");
            }
        });
        n5 = findViewById(R.id.n5);
        n5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"5");
            }
        });
        n6 = findViewById(R.id.n6);
        n6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"6");
            }
        });
        n7 = findViewById(R.id.n7);
        n7.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"7");
            }
        });
        n8 = findViewById(R.id.n8);
        n8.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"8");
            }
        });
        n9 = findViewById(R.id.n9);
        n9.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"9");
            }
        });
        n0 = findViewById(R.id.n0);
        n0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val+"0");
            }
        });
        clear = findViewById(R.id.clear);
        clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                value.setText("");
            }
        });
        plus = findViewById(R.id.plus);
        plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                value.setText(val + "+");
            }
        });
        equal = findViewById(R.id.equal);
        equal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = value.getText().toString();
                ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
                Object ans = engine.eval(val);
                Toast toast = Toast.makeText(MainActivity.this,"the ans is: "+ ans,Toast.LENGTH_SHORT);
                toast.show();
            }
        });
    }
}

PS. Мне нужен ответ как можно скорее, так как это для школьного проекта

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Чтобы упростить отладку здесь, сфокусируйтесь на этой строке:

Объект ans = engine.eval (val);

  1. Напечатайте значение val, чтобы мы могли видеть источник, который оценивается.
  2. Оберните эту строку в блок try catch и выведите полную трассировку стека, чтобы мы могли увидеть полную диагностику ошибок.
0 голосов
/ 28 августа 2018

Скопируйте этот оператор импорта

import javax.script.ScriptException;

Попробуйте код:

try {
    Object ans = engine.eval(val);
    System.out.println("It worked!:" + ans.toString());
}
catch (ScriptException se) {
    System.out.println("Problem in eval:", se.getmessage());
}
0 голосов
/ 28 августа 2018

Изменить ScriptException на Исключение

        try {
                ans = engine.eval(val);
            } catch (Exception e) {
                e.printStackTrace();
            }

Вы не уверены, для какого типа исключения оно может сработать, поэтому оно будет отображать одно и то же сообщение для всех исключений, и пользователь может не понять, какое именно возникло исключение. Вот причина, по которой вы должны поместить это конец всех блоков исключений

0 голосов
/ 28 августа 2018

Я бы сделал это следующим образом:

try{
     ScriptEngineManager manager = new ScriptEngineManager()
     ScriptEngine engine = manager.getEngineByExtension("js");
     Object ans = engine.eval(val);
     Toast toast = Toast.makeText(MainActivity.this,"the ans is: "+ ans,Toast.LENGTH_SHORT);
     toast.show();
catch(ScriptEngineManager e) {
     // handle exception
     System.err.println("Error making calculation: " + e.getMessage());
  }

РЕДАКТИРОВАТЬ: Изменить: String val = value.getText (). ToString (); value.setText (вал + "1"); У вас есть только значение в String val - но вам нужно содержимое текстового поля значения. В String val должно быть что-то вроде «4 + 4».

Вы просто добавляете числа в текстовое поле, но без операторов.

value.setText (вал + "1"); -> Вы просто добавляете число 1 к текстовому полю, поэтому после нажатия на некоторые кнопки у вас есть, как это в текстовом поле "512312"

...