【问题标题】:Calling a method to perform a task from a different class file调用方法以从不同的类文件执行任务
【发布时间】:2014-07-09 08:23:24
【问题描述】:

所以我的主要活动类 populateButton 中有一个按钮,它调用另一个类(.java 文件)中的方法并传递一个数组。这个主类文件还有一个方法可以将一些数据添加到一个名为 addNumber 的 TextView 中:

public class CheckerActivity extends Activity {

public TextView displayArray;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_checker);UMBERS_ARRAY);

    displayArray = (TextView) findViewById(R.id.currentNumbers);
}

public void populateButton(View view) {

    try {
        String[] arrayOfLatestWinner = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
        variousMethods giveArrayOfLatestWinners = new variousMethods();
        String[] tester = giveArrayOfLatestWinners.checkNumbers(CheckerActivity.this, arrayOfLatestWinner);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void addNumber(String[] numbersToAdd) {

    displayArray.setText(Arrays.toString(numbersToAdd));

}

我还有另一个类(.java 文件),其中包含一个名为 checkNumbers 的方法,该方法是从上面的 populateButton 调用的。

public class variousMethods {

public String[] checkNumbers(Context context, String[] latestNumbersArray) {
try {
        File myNumbersFile = new File((Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + context.getString(R.string.my_lotto_numbers_file))).toString());
        BufferedReader myNumbersFileReader = new BufferedReader(new FileReader(myNumbersFile));

        String inputLineOfMyNumbersFile;
        inputLineOfMyNumbersFile = myNumbersFileReader.readLine();

        while (inputLineOfMyNumbersFile != null) {
        String[] arrayOfInputLine = inputLineOfMyNumbersFile.split(" ");

        // Bad Code
        CheckerActivity addNumbers = new CheckerActivity();
        addNumbers.addNumber(arrayOfInputLine);

        //SORRY, MISSED THIS LINE
        inputLineOfMyNumbersFile = myNumbersFileReader.readLine();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

当 populatButton 被推送时,它会发送 String[] arrayOfLatestWinner 到 checkNumbers 中的各种方法。没关系。打开一个文件,我想要发生的是一次返回文件的一行,并通过 addNumbers(String[] numbersToAdd) 在 TextView 中显示它。 (我在这段代码中依赖只有最后一行最终会显示出来,最终会填充一个 GridView) 但是对 addNumber 的调用给出了 NullPointerException。

请问我哪里出错了?

logcat 是:

07-09 18:18:54.310  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ java.lang.NullPointerException
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at au.com.acent.ash.basiclottochecker.CheckerActivity.addNumber(CheckerActivity.java:84)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at au.com.acent.ash.basiclottochecker.variousMethods.checkNumbers(variousMethods.java:55)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at au.com.acent.ash.basiclottochecker.CheckerActivity.populateButton(CheckerActivity.java:51)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.view.View$1.onClick(View.java:3809)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.view.View.performClick(View.java:4421)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.view.View$PerformClick.run(View.java:17903)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:730)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.os.Looper.loop(Looper.java:213)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5225)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at au.com.acent.ash.basiclottochecker.variousMethods.checkNumbers(variousMethods.java:93)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at au.com.acent.ash.basiclottochecker.CheckerActivity.populateButton(CheckerActivity.java:51)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.view.View$1.onClick(View.java:3809)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.view.View.performClick(View.java:4421)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.view.View$PerformClick.run(View.java:17903)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:730)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.os.Looper.loop(Looper.java:213)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5225)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
07-09 18:18:54.320  29028-29028/au.com.acent.ash.basiclottochecker W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)`

【问题讨论】:

  • context 为空,这就是你得到 NPE 的原因。你也不能像这样创建活动实例。

标签: java android nullpointerexception


【解决方案1】:

CheckerActivity 是一个 Activity 类。它不是一个普通的java类。所以你永远不应该创建一个 Activity 类的实例。

这个

CheckerActivity addNumbers = new CheckerActivity();
addNumbers.addNumber(arrayOfInputLine);

错误导致NullPointerException

更多信息请阅读 Raghav Sood 的回答@

Can i Create the object of a activity in other class?

你真的需要另一门课吗?您可以在活动类中创建一个方法并随时调用它。

编辑:

您可以创建一个实用程序类

    public class Utility
    { 
        public String doSomething()
        {
            return "did something";
        }

    }       

活动中

  Utility ul = new Utility();
  String result = ul.doSomething(); 
  // update ui with result  

【讨论】:

  • 我知道这是错误的(因此出现了错误代码注释) 我尝试了许多不同的调用 addNumber 和读取堆的方法,但我就是想不通。请告诉我出了什么问题以及如何解决。
  • @Ash 在您的 Activity 类中有一个方法,并在您需要时调用它。您不需要其他课程
  • 这就是我正在做的不是吗?我在主活动类中使用方法的原因是因为它可以访问 TextView
  • 哦,我现在收到你的最后一条评论了。我试图拆分代码,以便活动类处理 GUI 内容,而我有另一个类来处理繁重的工作。将所有内容都保留在活动类中是吸气剂吗?
  • @Ash 你在其他地方使用这个功能吗?
【解决方案2】:

这里返回数组

public class variousMethods {

public void checkNumbers(Context context, TextView displayArray, String[] latestNumbersArray) {
try {
        File myNumbersFile = new File((Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + context.getString(R.string.my_lotto_numbers_file))).toString());
        BufferedReader myNumbersFileReader = new BufferedReader(new FileReader(myNumbersFile));

        String inputLineOfMyNumbersFile;
        inputLineOfMyNumbersFile = myNumbersFileReader.readLine();

        while (inputLineOfMyNumbersFile != null) {
        String[] arrayOfInputLine = inputLineOfMyNumbersFile.split(" ");

        inputLineOfMyNumbersFile = myNumbersFileReader.readLine();
        while (inputLineOfMyNumbersFile != null) {
            displayArray.setText(Arrays.toString(inputLineOfMyNumbersFile));
            inputLineOfMyNumbersFile = myNumbersFileReader.readLine();
        }

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

您可以删除添加号码方法。

variousMethods giveArrayOfLatestWinners = new variousMethods();
giveArrayOfLatestWinners.checkNumbers(CheckerActivity.this, displayArray, arrayOfLatestWinner);

【讨论】:

  • 哎呀,对不起,我错过了那里的一行代码。请查看您说要退货的更新问题。我想要的是读取文件的一行,将该行放入 TextView,然后读取另一行,将其放入同一个 TextView 等,直到 EOF(我知道它只会在完成后显示文件的最后一行,最终将填充一个 GridView)
  • @Ash 为什么不将引用传递给 TextView 以及方法,以便可以在 variousMethods 函数本身中更新更改?
  • 这正是我想做的,但谷歌不会告诉我怎么做! (我不知道该问什么)那将是理想的!如何做到这一点?这就是下面的答案吗?
  • @Ash 我已经更新了答案。不确定这是否是你真正想要的
  • 这符合我的要求,我之前曾尝试过,但它给出了cannot resolve symbol 'displayArray 我认为是因为 displayArray 是在不同的类中定义的??
【解决方案3】:

在这种情况下你必须使用单例,使用 getinstance 方法你可以调用活动方法,如:

在您的活动中

 static YourActivity _activity;

公共静态活动 getInstance(){ 返回_活动; }

在 oncreate 中:

   _activity = this

无论您想在哪里使用此活动的任何方法,只需调用如下:

_activity.getInstance().callmethod();

【讨论】:

  • Activity 类的单例?
  • 我是否将static Activity _activity = Activtyname.this; 放在public TextView displayArray;' is? If so, I get an error: 不能从静态上下文中引用`
  • Dev Carlsberg,你感冒了吗?你的看起来可能有用。
猜你喜欢
  • 2013-09-15
  • 2022-11-23
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多