¿Cómo resolver java.lang.IllegalStateException en el subproceso principal de Java?

Un evento inesperado y no deseado que interrumpe el flujo normal de un programa se llama Excepción .

La mayoría de las excepciones son causadas por nuestro programa y son recuperables. Ejemplo: si el requisito de nuestro programa es leer datos del archivo remoto ubicado en EE. UU. En tiempo de ejecución, si un archivo remoto no está disponible, obtendremos RuntimeException diciendo fileNotFoundException. Si se produce la excepción fileNotFoundException, podemos proporcionar el archivo local al programa para que lo lea y continúe con el resto del programa normalmente.

Hay principalmente dos tipos de excepción  en Java de la siguiente manera:

1. Excepción marcada:

La excepción que verifica el compilador para la ejecución fluida del programa en tiempo de ejecución se denomina excepción verificada. En nuestro programa, si existe la posibilidad de que aumente la excepción verificada, entonces es obligatorio que manejemos esa excepción verificada (ya sea mediante la palabra clave try-catch o throws); de lo contrario, obtendremos un error en tiempo de compilación.

Ejemplos de excepciones verificadas son ClassNotFoundException, IOException, SQLException, etc.

2. Excepción no verificada:

Las excepciones que no son verificadas por el compilador, ya sea que el programador las maneje o no, se denominan excepciones no verificadas.

Ejemplos de excepciones no verificadas son ArithmeticException, ArrayStoreException, etc.

Ya sea que la excepción esté marcada o no, cada excepción ocurre en tiempo de ejecución solo si no hay posibilidad de que ocurra ninguna excepción en tiempo de compilación.

IllegalStateException es la clase secundaria de RuntimeException y, por lo tanto, es una excepción no verificada. Esta excepción la plantea explícitamente el programador o el desarrollador de la API para indicar que se ha invocado un método en el momento equivocado. Generalmente, este método se usa para indicar que se llama a un método en un momento ilegal o inapropiado.

Ejemplo: después de iniciar un hilo, no se nos permite reiniciar el mismo hilo una vez más, de lo contrario, obtendremos una excepción de tiempo de ejecución que dice IllegalStateException.

Ejemplo 1: Llamamos al método start() cuando ya está ejecutando el método run().

Java

// Java program to show the occurrence of
// IllegalStateException.
 
// Import required packages
 
import java.io.*;
import java.util.*;
 
// Creating a thread in our myThread class by extending the
// Thread class
// class 1
// Helper class
 
class myThread extends Thread {
   
    // Method in helper class
    // declaring run method
    public void run()
    {
 
        for (int i = 0; i < 5; i++) {
           
            // Display message
            System.out.println("GeeksForGeeks");
        }
    }
}
 
// class 2
// Main class
class Thread1 {
   
    // Main driver method
    public static void main(String[] args)
    {
        // creating a thread object  in the main() method
        // of our helper class above
        myThread t = new myThread();
       
        // Starting the above created thread
        // using the start() method
        t.start();
       
        // Display Message
        System.out.println("Main Thread");
       
        // starting the thread again when it is already
        // running and hence it cause an exception
        t.start();
    }
}

Ejemplo 2: Llamamos al método start() en un subproceso cuando ha terminado de ejecutar el método run(). 

Java

// Java program to show the occurrence of
// IllegalStateException.
 
// Import required packages
import java.io.*;
import java.util.*;
 
// Creating a thread in our myThread class by extending the
// Thread class
// class 1
// Helper class
class myThread extends Thread {
   
    // Method in helper class
    // declaring run method
    public void run()
    {
 
        for (int i = 0; i < 5; i++) {
           
            // Display message
            System.out.println("GeeksForGeeks");
        }
    }
}
 
// class 2
// Main class
class Thread1 {
   
    // Main driver method
    public static void main(String[] args)
    {
        // creating a thread object  in the main() method
        // of our helper class above
        myThread t = new myThread();
       
        // Starting the above created thread
        // using the start() method
        t.start();
       
        try {
            System.out.println("Main Thread is going to sleep");
           
            // making main thread sleep for 2000ms
            t.sleep(2000);
            System.out.println("Main Thread awaken");
        }
        catch (Exception e) {
            System.out.println(e);
        }
 
        // Display Message
        System.out.println("Main Thread");
       
        // calling start( ) method on a dead thread
        // which causes exception
        t.start();
    }
}

 ¿Cómo resolver este error?

Para evitar java.lang.IllegalStateException en el subproceso principal de Java, debemos asegurarnos de que no se pueda llamar a ningún método en nuestro código en un momento ilegal o inapropiado.

En el ejemplo anterior, si llamamos al método start() solo una vez en el subproceso t, no obtendremos ninguna java.lang.IllegalStateException porque no estamos llamando al método start() después del inicio del subproceso (es decir, no estamos llamando al método start()() método en un momento ilegal o inapropiado.) 

Java

// Java program to demonstrate that the error
// does not occur in this program
 
// Import required packages
import java.io.*;
import java.util.*;
 
// Creating a thread in our myThread class by extending the
// Thread class
// class 1
// Helper class
class myThread extends Thread {
   
    // Method in helper class
    // declaring run method
    public void run()
    {
 
        for (int i = 0; i < 5; i++) {
           
            // Display message
            System.out.println("GeeksForGeeks");
        }
    }
}
 
// class 2
// Main class
class Thread1 {
   
    // Main driver method
    public static void main(String[] args)
    {
        // creating a thread object  in the main() method
        // of our helper class above
        myThread t = new myThread();
       
        // Starting the above created thread
        // using the start() method
        t.start();
       
        try {
            System.out.println("Main Thread is going to sleep");
           
            // making main thread sleep for 2000ms
            t.sleep(2000);
           
            System.out.println("Main Thread awaken");
        }
        catch (Exception e) {
            System.out.println(e);
        }
 
        // Display Message
        System.out.println("Main Thread");
    }
}

Publicación traducida automáticamente

Artículo escrito por mroshanmishra0072 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *