首页 > 解决方案 > 应用程序返回错误:无法执行方法:onClick

问题描述

我是 Android 工作室的新手,正在做我的第一个主要项目,这是一个计算分数和整数的计算器。
我现在只编写了用于添加数字的函数,以便我可以测试它是否按预期运行,稍后我将添加其他方法。
但是,当我在我的(外部)平板电脑上运行该应用程序时,我收到此错误:

2020-06-08 21:45:14.250 11504-11504/com.example.fraccalcapp E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.example.fraccalcapp, PID: 11504
java.lang.IllegalStateException: Could not execute method for android:onClick
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24774)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6518)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24774) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6518) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
 Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x1
    at android.content.res.Resources.getText(Resources.java:339)
    at android.widget.TextView.setText(TextView.java:5496)
    at com.example.fraccalcapp.MainActivity.setResult(MainActivity.java:110)
    at com.example.fraccalcapp.MainActivity.addNumbers(MainActivity.java:35)
    at java.lang.reflect.Method.invoke(Native Method) 
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24774) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6518) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

这是我的 MainActivity.java (这是我的应用程序中唯一的活动)代码:

package com.example.fraccalcapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText number1;
    EditText number2;
    TextView wholeNumber;
    TextView numerator;
    TextView denominator;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void addNumbers(View view){
        number1 = findViewById(R.id.editText_number1);
        number2 = findViewById(R.id.editText_number2);
        int[] frac1 = convertToSimple(convertToFraction(number1.getText().toString()));
        int[] frac2 = convertToSimple(convertToFraction(number2.getText().toString()));
        int numerator1 = frac1[0];
        int denominator1 = frac1[1];
        int numerator2 = frac2[0];
        int denominator2 = frac2[1];
        int commonDenominator = getLCM(denominator1, denominator2);
        int[] result = {numerator1 + numerator2, commonDenominator, 0};
        result = simplify(result);
        setResult(result);
    }
    public void subNumbers(View view){

    }
    public void mulNumbers(View view){

    }
    public void divNumbers(View view){

    }
    public int[] convertToFraction(String rawFraction){
        int[] result = {0,1,0};
        if (rawFraction.contains("/") && !rawFraction.contains(" ")){
            //regular fraction
            String[] rawResult = rawFraction.split("/");
            result = new int[]{Integer.parseInt(rawResult[0]), Integer.parseInt(rawResult[1]), 0};
            if (result[0] > result[1]){
                int num = result[0];
                int den = result[1];
                int whole = (int) (result[2] + (num/den));
                num = num % den;
                result = new int[] {num, den, whole};
            }
        } else if (!rawFraction.contains(" ") && !rawFraction.contains("/")){
            //whole number
            int wholeNum = Integer.parseInt(rawFraction);
            result = new int[]{0,1,wholeNum};
        } else if (rawFraction.contains("/") && rawFraction.contains(" ")){
            //mixed fraction
            String[] wholeSplit = rawFraction.split(" ");
            int whole = Integer.parseInt(wholeSplit[0]);
            String[] fracSplit = wholeSplit[1].split("/");
            int num = Integer.parseInt(fracSplit[0]);
            int den = Integer.parseInt(fracSplit[1]);
            result = new int[]{num, den, whole};
        } else {
            Toast.makeText(getApplicationContext(), "You have entered the number in the wrong format. Please read instructions.",
                    Toast.LENGTH_LONG).show();
        }
        return result;
    }
    public int[] convertToSimple(int[] fraction){
        int num = fraction[0];
        int den = fraction[1];
        int whole = fraction[2];
        int newNum = num + (whole * den);
        int[] result = {newNum, den, 0};
        return result;
    }
    public int getHCF(int a, int b){
        int rem = 1;
        int dend = Math.max(a,b);
        int sor = Math.min(a,b);
        do{
           rem = dend / sor;
           dend = sor;
           sor = rem;
        } while (rem !=0);
        return dend;
    }
    public int getLCM(int a, int b){
        int hcf = getHCF(a, b);
        int lcm = (a * b)/hcf;
        return lcm;
    }
    public void setResult(int[] result){
        wholeNumber = findViewById(R.id.textView_wholeNumber);
        numerator = findViewById(R.id.textView_numerator);
        denominator = findViewById(R.id.textView_denominator);
        if (result[0] != 0 && result[1] != 1){
            numerator.setText(result[0]);
            denominator.setText(result[1]);
        }
        if (result[2] != 0){
            wholeNumber.setText(result[2]);
        }
    }
    public int[] simplify(int[] fraction){
        int[] frac = convertToSimple(fraction);
        int num = fraction[0];
        int den = fraction[1];
        int whole = fraction[2];
        int num_den_hcf = getHCF(num, den);
        if (num_den_hcf != 1){
            num /= num_den_hcf;
            den /= num_den_hcf;
        }
        if (num > den){
            whole += num/den;
            num = num%den;
        }
        if (num == den){
            num = 0;
            den= 1;
            whole += 1;
        }
        int[] result = {num, den, whole};
        return result;
    }
}

我从错误中无法理解,这就是为什么我求助于你。如果代码中有一些愚蠢的错误,请原谅我。

编辑:使用 Swayangjit 的解决方案阻止了应用程序给出这个错误,但它仍然没有在 textView 中显示文本。

标签: javaandroid

解决方案


Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x1
at android.content.res.Resources.getText(Resources.java:339)
at android.widget.TextView.setText(TextView.java:5496)
at com.example.fraccalcapp.MainActivity.setResult(MainActivity.java:110)
at com.example.fraccalcapp.MainActivity.addNumbers(MainActivity.java:35)
at java.lang.reflect.Method.invoke(Native Method) 
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
at android.view.View.performClick(View.java:6294) 
at android.view.View$PerformClick.run(View.java:24774) 
at android.os.Handler.handleCallback(Handler.java:790) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6518) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

注意这些堆栈跟踪行。它说应用程序无法在一行中找到您尝试作为参数传递的资源

com.example.fraccalcapp.MainActivity.setResult(MainActivity.java:110)

仔细检查此代码和您在此处使用的资源 ID


推荐阅读