Android Java.Lang.IllegalStateException 수정: 활동의 메서드를 실행할 수 없음
-
java.lang.IllegalStateException: Could not execute method of the activity
오류를 재현합니다. -
java.lang.IllegalStateException: Could not execute method of the activity
오류의 원인 -
java.lang.IllegalStateException: Could not execute method of the activity
오류 수정
이 자습서에서는 Java에서 Android 애플리케이션을 만드는 동안 java.lang.IllegalStateException: Could not execute method of the activity
오류의 데모를 안내합니다. 또한 이 오류의 원인에 대해 설명하고 해결 방법을 제공합니다.
java.lang.IllegalStateException: Could not execute method of the activity
오류를 재현합니다.
예제 코드:
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: Could not execute method of the activity
오류의 원인
이 오류는 예외 체인에서 IllegalStateException
을 생성하는 NullPointerException
으로 인해 발생합니다. 따라서 이 오류가 발생하는 이유를 파악하려면 null
, NullPointerException
및 IllegalStateException
에 대해 충분히 알고 있어야 합니다.
null
은 컴퓨터 프로그래머 사이에서 매우 잘 알려진 키워드입니다. 예를 들어 Arrays
, Enums
, Interfaces
및 Classes
와 같은 참조 변수 또는 데이터 유형에 대한 리터럴입니다.
NullPointerException
은 애플리케이션이 null
값이 있는 메서드에 액세스하는 것을 의미하는 개체 참조를 검색하려고 할 때 발생하는 런타임 예외입니다. 우리 프로그램을 되돌아보면 어떤 변수도 null
값으로 초기화되지 않았음을 알 수 있습니다.
중요한 점은 null
값이 선언할 때마다 자동으로 참조 변수에 저장되지만 초기화하지 않는다는 것입니다. 참조 데이터 유형은 선언 프로세스 중에 초기화되지 않은 경우 기본값으로 null
값을 포함합니다.
반면 IllegalStateException
은 메소드가 불법적이거나 잘못된 시간에 호출 또는 호출되었음을 보여주는 런타임 예외입니다.
이제 오류가 예외 체인에서 IllegalStateException
을 생성하는 NullPointerException
에 의해 발생한다는 것을 알고 있습니다. 자, 이것을 고치는 방법을 알아 봅시다.
java.lang.IllegalStateException: Could not execute method of the activity
오류 수정
MainActivity.java
클래스의 시작 부분에는 초기화하지 않았지만 선언한 EditText
유형의 startPort
및 stopPort
라는 두 개의 변수가 있습니다. 이는 다음 코드 행을 실행하려고 할 때 기본값이 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
을 잡아
충돌 없이 애플리케이션을 실행할 수 있습니다. 여기에서는 예외를 생성할 수 있는 try
블록 내부의 코드 조각만 작성합니다.
catch
블록은 try
블록에서 발생하는 예외 처리를 담당하고 거기에서 실행을 재개합니다. catch
블록을 실행한 후 프로그램은 try
블록으로 돌아가지 않습니다.
그렇기 때문에 예외가 발생할 수 있는 try
블록에 해당 코드 줄만 작성합니다.