0

我正在尝试制作一个计算器应用程序。我想评估 TextView 的内容并将其显示为 toast 消息。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

4 回答 4

0

为了简化这里的调试,关注这一行:

对象 ans = engine.eval(val);

  1. 打印 val 的值,以便我们可以看到正在评估的源。
  2. 将该行包装在 try catch 块中并打印完整的堆栈跟踪,以便我们可以看到完整的错误诊断。
于 2018-08-28T23:45:51.890 回答
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());
  }

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

您只需将数字添加到文本字段,但没有运算符。

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

于 2018-08-28T09:02:40.643 回答
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());
}
于 2018-08-28T09:02:52.887 回答
0

用异常更改 ScriptException

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

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

于 2018-08-28T12:20:17.773 回答