我无法使用eval()评估字符串

时间:2018-08-28 08:50:40

标签: java android xml javax.script

我正在尝试制作计算器应用程序。我想评估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 :(得分:0)

我愿意这样进一步调查:

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());
  }

编辑:更改: 字符串val = value.getText()。toString();                 value.setText(val +“ 1”); 您只有String val中的值-但您需要value文本字段的内容。在String val中,必须有类似“ 4 + 4”的内容。

您只需在文本字段中添加数字,但无需添加运算符。

value.setText(val +“ 1”); ->您只需将数字1添加到文本字段中,因此在单击某些按钮后,在文本字段“ 512312”中将具有这样的内容

答案 1 :(得分:0)

复制此导入语句

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());
}

答案 2 :(得分:0)

使用Exception更改ScriptException

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

您不确定会触发哪种异常,因此对于所有异常它都会显示相同的消息,并且用户可能无法理解发生了哪种异常。那就是您应该放置在所有特定异常捕获块末尾的原因

答案 3 :(得分:0)

要在此处简化调试,请重点关注以下行:

对象ans = engine.eval(val);

  1. 打印val的值,以便我们可以查看正在评估的源。
  2. 将这一行包裹在try catch块中并打印完整的堆栈跟踪,以便我们可以看到完整的错误诊断信息。