修正 Android Java.Lang.IllegalStateException: アクティビティのメソッドを実行できませんでした

Mehvish Ashiq 2023年10月12日
  1. java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした エラーを再現する
  2. java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした エラーの原因
  3. java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした エラーを修正
修正 Android Java.Lang.IllegalStateException: アクティビティのメソッドを実行できませんでした

このチュートリアルでは、Java で Android アプリケーションを作成する際に発生する java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした エラーのデモンストレーションについて説明します。 これは、このエラーの背後にある理由についても説明し、それを解決するためのソリューションを提供します.

java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした エラーを再現する

コード例:

package com.example.npe;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class MainActivity extends Activity implements OnClickListener {
  EditText ipAddressField;
  TextView scanOut;
  TextView portResults;
  EditText startPort;
  EditText stopPort;

  protected void onCreate(Bundle instanceState) {
    super.onCreate(instanceState);
    setContentView(R.layout.activity_main);

    ipAddressField = (EditText) findViewById(R.id.ip_address_field);
    ipAddressField.getText();
    scanOut = (TextView) findViewById(R.id.scan_out);

    Button scanButton = (Button) findViewById(R.id.scanButton);
    scanButton.setOnClickListener(this);
  }

  public void onClick(View view) {
    Editable host = ipAddressField.getText();

    switch (view.getId()) {
      case R.id.scanButton:
        try {
          String pingCommand = "ping -c 5 " + host;
          String pingOutput = "";
          Runtime runtime = Runtime.getRuntime();
          Process process = runtime.exec(pingCommand);
          BufferedReader bufferedReader =
              new BufferedReader(new InputStreamReader(process.getInputStream()));

          String str;
          while ((str = bufferedReader.readLine()) != null) {
            System.out.println(str);
            scanOut.setText(str + "\n"
                + "\n");
            pingOutput += str;
            scanOut.setText("/n" + pingOutput);
          }

          bufferedReader.close();
        } // try
        catch (IOException exception) {
          System.out.println(exception);
        }
        break;
      default:
        break;
    }
  }

  public void OnClickPort(View view) {
    switch (view.getId()) {
      case R.id.button1:

        int rangeOfStartPort = Integer.parseInt(startPort.getText().toString());
        int rangeOfStopPort = Integer.parseInt(stopPort.getText().toString());

        for (int j = rangeOfStartPort; j <= rangeOfStopPort; j++) {
          try {
            Socket serverSocket = new Socket("192.168.0.1", j);
            Toast.makeText(getApplicationContext(), "Port that is in use: " + j, Toast.LENGTH_LONG)
                .show();
            serverSocket.close();
          } catch (Exception exception) {
            exception.printStackTrace();
          }

          System.out.println("Port that is not in use: " + j);
        }
    }
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.activity_main, menu);
    return super.onCreateOptionsMenu(menu);
  }
}

この単純なコードを書いて、ある程度役立つアプリケーションを作成しました。

基本的に、Java コード (ping A、ポート スキャン) の有用なビットを取り上げます。 次に、それらをアプリケーションに追加しますが、実行すると、実行時に次のエラーが生成されます。

エラーの説明:

FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity

なぜこの厄介なエラーが発生するのでしょうか? 次のセクションをチェックして、考えられる理由を見つけてください。

java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした エラーの原因

このエラーは、例外チェーンで IllegalStateException を生成する NullPointerException によって引き起こされます。 したがって、このエラーが発生する理由を理解するには、nullNullPointerException、および IllegalStateException について十分に理解することが不可欠です。

null は、コンピューター プログラマーの間で非常によく知られているキーワードです。 これは、参照変数またはデータ型のリテラルです。たとえば、ArraysEnumsInterfaces、および Classes です。

NullPointerException は、アプリケーションが null 値を持つメソッドにアクセスすることを意味するオブジェクト参照を取得しようとしたときに発生する実行時例外です。 プログラムを振り返ってみると、どの変数も null 値で初期化されていないことがわかります。

重要な点は、null 値は、宣言するが初期化しないときはいつでも参照変数に自動的に格納されるということです。 参照データ型は、宣言プロセス中に初期化されない場合、デフォルト値として null 値を含みます。

一方、IllegalStateException は、メソッドが不正または間違ったタイミングで呼び出されたか、呼び出されたことを示す実行時例外です。

このエラーは、例外チェーンで IllegalStateException を生成する NullPointerException によって引き起こされることがわかりました。 それでは、これを修正する方法を考えてみましょう。

java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした エラーを修正

MainActivity.java クラスの先頭には、EditText 型の startPortstopPort という名前の 2つの変数があり、初期化はしていませんが宣言しています。 これは、次のコード行を実行しようとした時点で、デフォルト値が null であることを意味します。

コード例:

int rangeOfStartPort = Integer.parseInt(startPort.getText().toString());
int rangeOfStopPort = Integer.parseInt(stopPort.getText().toString());

java.lang.IllegalStateException: Could not execute method of the activity エラーが発生する理由は、null を含む EditText 型の参照変数にアクセスしようとしているためです。 したがって、次のように findViewById() を使用して、onCreate() メソッド内で startPortstopPort を初期化する必要があります。

コード例:

startPort = (EditText) findViewById(R.id.write_start_field_here);
stopPort = (EditText) findViewById(R.id.write_stop_field_here);

findViewById() メソッドは、コンポーネントの id 値をパラメーターとして受け取り、Android アプリケーションに存在するコンポーネントを見つけるのに役立ちます。 別の解決策は、次のように try-catch ブロックを追加することです。

コード例:

try {
  int rangeOfStartPort = Integer.parseInt(startPort.getText().toString());
  int rangeOfStopPort = Integer.parseInt(stopPort.getText().toString());
} catch (Exception ex) {
  ex.printStackTrace();
}

try-catch ブロックを使用すると、NullPointerExceptioncatch し、アプリケーションをクラッシュさせることなく実行できます。 ここでは、例外を生成する可能性がある try ブロック内のコード部分のみを記述します。

catch ブロックは try ブロックで発生した例外を処理し、そこから実行を再開します。 catch ブロックを実行した後、プログラムは try ブロックに戻りません。

そのため、これらのコード行のみを try ブロックに記述し、例外が発生する可能性があります。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - Java Error