修正 Android Java.Lang.IllegalStateException: アクティビティのメソッドを実行できませんでした
-
java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした
エラーを再現する -
java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした
エラーの原因 -
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
によって引き起こされます。 したがって、このエラーが発生する理由を理解するには、null
、NullPointerException
、および IllegalStateException
について十分に理解することが不可欠です。
null
は、コンピューター プログラマーの間で非常によく知られているキーワードです。 これは、参照変数またはデータ型のリテラルです。たとえば、Arrays
、Enums
、Interfaces
、および Classes
です。
NullPointerException
は、アプリケーションが null
値を持つメソッドにアクセスすることを意味するオブジェクト参照を取得しようとしたときに発生する実行時例外です。 プログラムを振り返ってみると、どの変数も null
値で初期化されていないことがわかります。
重要な点は、null
値は、宣言するが初期化しないときはいつでも参照変数に自動的に格納されるということです。 参照データ型は、宣言プロセス中に初期化されない場合、デフォルト値として null
値を含みます。
一方、IllegalStateException
は、メソッドが不正または間違ったタイミングで呼び出されたか、呼び出されたことを示す実行時例外です。
このエラーは、例外チェーンで IllegalStateException
を生成する NullPointerException
によって引き起こされることがわかりました。 それでは、これを修正する方法を考えてみましょう。
java.lang.IllegalStateException: アクティビティのメソッドを実行できませんでした
エラーを修正
MainActivity.java
クラスの先頭には、EditText
型の startPort
と stopPort
という名前の 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()
メソッド内で startPort
と stopPort
を初期化する必要があります。
コード例:
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
ブロックを使用すると、NullPointerException
を catch
し、アプリケーションをクラッシュさせることなく実行できます。 ここでは、例外を生成する可能性がある try
ブロック内のコード部分のみを記述します。
catch
ブロックは try
ブロックで発生した例外を処理し、そこから実行を再開します。 catch
ブロックを実行した後、プログラムは try
ブロックに戻りません。
そのため、これらのコード行のみを try
ブロックに記述し、例外が発生する可能性があります。