Bloques de captura múltiple en Java

Sumérgete en el mundo de la programación Java mientras exploras las intrincadas funcionalidades de los Bloques de Captura Múltiple de Java en esta completa guía. Comprende la mecánica que subyace al funcionamiento de los Bloques de Captura Múltiple de Java, y descubre cómo pueden mejorar drásticamente la legibilidad y la eficiencia del código. Además, profundiza en la aplicación práctica con una guía paso a paso sobre la adición de bloques de captura múltiple en Java, y explora la posibilidad de capturar múltiples excepciones en un bloque. Desentierra las reglas y restricciones que rodean a esta función con una revisión detallada, y presénciala en acción mediante ejemplos prácticos. Por último, comprende cómo el uso de múltiples bloques try catch en Java puede conducir a una gestión más inteligente de los errores, potenciando en última instancia tu destreza en la programación Java.

Pruéablo tú mismo

Millones de tarjetas didácticas para ayudarte a sobresalir en tus estudios.

Regístrate gratis

Review generated flashcards

Regístrate gratis
Has alcanzado el límite diario de IA

Comienza a aprender o crea tus propias tarjetas de aprendizaje con IA

Equipo editorial StudySmarter

Equipo de profesores de Bloques de captura múltiple en Java

  • Tiempo de lectura de 21 minutos
  • Revisado por el equipo editorial de StudySmarter
Guardar explicación Guardar explicación
Tarjetas de estudio
Tarjetas de estudio

Saltar a un capítulo clave

    Comprender los Bloques de Captura Múltiple de Java

    Comprender los Bloques de Captura Múltiple de Java es clave para programar en Java. Estos bloques permiten capturar múltiples excepciones, lo que mejora la gestión de errores en tu código. La programación en Java suele implicar la gestión de muchos tipos de errores y excepciones. Éstos pueden ir desde errores de archivo, errores de red, hasta excepciones de puntero nulo. Los Bloques de Captura Múltiple de Java son bloques de programación funcionales ideados para tratar un conjunto diverso de excepciones que pueden producirse al ejecutar código Java.

    En Java, una excepción es un evento que interrumpe el flujo normal del programa. Es un objeto que se lanza en tiempo de ejecución.

    La función de los Bloques de Captura Múltiple de Java

    Los Bloques de Captura Múltiple de Java sirven para manejar distintas excepciones por separado. Cumplen la función esencial de controlar el flujo de ejecución cuando se producen estas excepciones variadas.

    Por ejemplo, puede que quieras imprimir un mensaje de error personalizado o realizar una acción específica cuando se produzca una FileNotFoundException. Pero si se trata de una ArithmeticException (como intentar dividir por cero), querrás hacer algo distinto: tal vez quieras detener instantáneamente el programa o lanzar una excepción personalizada. Los Bloques de Captura Múltiple de Java te permiten hacer precisamente esto. Te permiten establecer respuestas distintas para diferentes circunstancias excepcionales.

    Para implementar Bloques de Captura Múltiple en Java, permites que un manejador de excepciones se ocupe de varias excepciones distintas. Cada bloque de captura debe corresponder a un tipo distinto de excepción. Decidir el orden de estos bloques es crucial: el bloque de captura para el tipo de excepción más específico debe escribirse siempre antes que el bloque para su equivalente más general.
    try { // código que puede lanzar distintas excepciones } catch (FileNotFoundException e) { // código para gestionar una FileNotFoundException } catch (ArithmeticException e) { // código para gestionar una ArithmeticException } catch (Exception e) { // código para gestionar cualquier otra excepción }

    Cómo los Bloques de Captura Múltiple de Java mejoran la legibilidad y eficiencia del código

    Los Bloques de Captura Múltiple de Java mejoran fundamentalmente la legibilidad del código al segregar el código de gestión de errores en función del tipo de excepción. Al utilizar numerosos bloques de captura, puedes comprender rápidamente qué bloque corresponde a cada tipo de excepción, lo que da lugar a un código más legible y fácil de mantener. En cuanto a la eficiencia, los bloques de captura múltiples permiten enfoques de gestión de errores muy particulares e individualizados para cada excepción. Esto mejora significativamente la solidez de tu código y también garantiza la eficiencia de los recursos. Al asociar estrechamente los tipos de excepción con la lógica de gestión de errores correspondiente, puedes evitar un enfoque único para todos e idear respuestas a las excepciones muy eficientes y específicas para cada caso. Otra ventaja reside en la capacidad de los Bloques de Captura Múltiple para gestionar código antiguo. Incluso si tu programa Java está llamando a un método de una biblioteca o a un fragmento de código antiguo que carece de documentación exhaustiva sobre excepciones, el uso de múltiples bloques de captura puede crear una red de seguridad más amplia.

    Con Java 7 y en adelante, puedes manejar más de un tipo de excepción en un solo bloque catch, utilizando una función llamada multi-catch. En multicatch, los tipos de excepciones se desconectan mediante un carácter de tubería (|) en la cláusula catch. ¿Quieres profundizar aún más? He aquí cómo funciona en la práctica:

    try { // código que puede lanzar distintas excepciones } catch (FileNotFoundException | ArithmeticException e) { // código para gestionar una FileNotFoundException o una ArithmeticException } catch (Exception e) { // código para gestionar cualquier otra excepción }

    Cómo utilizar los bloques catch múltiples en Java

    Utilizar bloques catch múltiples en Java es un procedimiento sencillo una vez que entiendes el concepto. Básicamente, consiste en identificar las posibles excepciones que puede lanzar tu código y, a continuación, crear bloques catch distintos para cada una de ellas. Cada bloque catch debe tener un tipo único de excepción para manejar las posibles trampas que puedan surgir durante la ejecución de tu código.

    Guía paso a paso para añadir varios bloques catch en Java

    Cuando añadas bloques catch múltiples en Java, es crucial que sigas estos pasos con la debida atención **Identificar las excepciones potenciales**: El primer paso consiste en identificar correctamente las excepciones que podría lanzar tu código. Éstas podrían incluir excepciones de Entrada/Salida, excepciones de puntero nulo, excepciones aritméticas, etc. 2. **Crear el bloque try**: Una vez que hayas identificado estas excepciones, encapsula el código que podría provocarlas dentro de un bloque try. La palabra clave "try" se utiliza para especificar un bloque en el que se sospecha que puede producirse ingeniería inversa. 3. **Añadir varios bloques catch**: Por cada tipo de excepción identificado, debes añadir un bloque catch. El bloque catch captura la excepción lanzada por el bloque try y ejecuta una serie de instrucciones para manejar la excepción. Veamos un ejemplo que ilustra el proceso paso a paso.
    try { int a = 30, b = 0; int c = a/b; // esto lanzará una ArithmeticException System.out.println ("Resultado = " + c); } catch (ArithmeticException e) { System.out.println ("No se puede dividir por cero " + e); } catch (Exception e) { System.out.println ("Excepción capturada = " + e); }
    En este ejemplo, el código del bloque try lanza una ArithmeticException. Esta excepción es capturada por el bloque catch de ArithmeticException.

    Uso práctico de varios bloques try-catch en Java

    Para comprender el uso práctico de varios bloques try-catch, analicemos un ejemplo:
    try { // código que puede lanzar distintas excepciones openFile(fileName); // puede lanzar una IOException processFile(); // puede lanzar una FileFormatException writeFile(); // puede lanzar una IOException } catch (IOException e) { // código para gestionar la IOException System.out.println("Se ha producido una excepción de entrada-salida: " + e.getMessage()); } catch (FileFormatException e) { // código para tratar la FileFormatException System.out.println("El formato del archivo es incorrecto: " + e.getMessage()); } catch (Exception e) { // código para tratar cualquier otra excepción System.out.println("Error inesperado:
    " +
    e.getMessage()); }
    En este ejemplo, las funciones openFile(), processFile() y writeFile() pueden lanzar distintos tipos de excepciones. En general, el uso práctico de múltiples bloques catch proporciona una plataforma para que los programas Java sean más robustos ante obstáculos inesperados, mejorando su eficacia, legibilidad y fiabilidad en el proceso.

    ¿Podemos tener varios bloques catch en Java?

    Por supuesto que sí. En Java puedes tener varios bloques de captura. Se trata de una característica clave del mecanismo de gestión de excepciones de Java que mejora tanto la legibilidad del código como tu capacidad para gestionar eficazmente una amplia variedad de excepciones que pueden interrumpir el curso normal de la ejecución de un programa.

    Explorar la posibilidad de que Java atrape varias excepciones en un bloque

    Ahora vamos a sumergirnos en el meollo de la captura de múltiples excepciones en un bloque en Java. En primer lugar, es fundamental comprender que esta capacidad se introdujo sólo a partir de Java 7. Por tanto, si utilizas versiones anteriores de Java, no podrás aprovechar esta función y tendrás que utilizar bloques de captura individuales para cada tipo de excepción. Sin embargo, con Java 7 y posteriores, puedes capturar varias excepciones en un solo bloque utilizando una sintaxis sencilla e intuitiva. Esto se conoce comúnmente como captura múltiple. El procedimiento consiste en especificar varios tipos de excepción en un único bloque catch, separados por el símbolo de la tubería ('|'). He aquí un pequeño ejemplo para ilustrarlo:
    try { // Bloque de código que podría lanzar excepciones } catch (IOException | SQLException | ClassNotFoundException e) { // Manejo de los tres tipos de excepción }
    En el ejemplo anterior, el único bloque catch atrapará y manejará cualquiera de los tres tipos de excepción: IOException, SQLException y ClassNotFoundException. Esto agiliza tu código y elimina la necesidad de duplicar la lógica de manejo en varios bloques catch. Cabe destacar que el parámetro catch (en nuestro caso, "e") es implícitamente final, lo que significa que no puedes alterar su valor dentro del bloque catch. Además, la función multicatch sólo funciona con excepciones que sean disjuntas, es decir, que no estén en una cadena de herencia. Esto se hace para evitar ocultar cláusulas catch para tipos de excepción de subclases, lo que puede dar lugar a código inalcanzable.

    Revisión detallada de las normas y restricciones de los Bloques de Captura Múltiple de Java

    Aunque la función de bloques de captura múltiples de Java hace que la gestión de excepciones sea mucho más flexible y eficaz, hay algunas reglas y restricciones importantes que debes conocer:
    • Orden de los bloques de captura: El orden de los bloques catch es importante. Debes colocar los bloques catch para tipos de excepción más específicos antes que los de tipos más generales. Esto permite a Java hacer coincidir primero el tipo de excepción más específico. Si no sigues esta regla, se producirá un error de compilación.
    • Excepciones disjuntas: Al utilizar la captura múltiple en Java 7 y versiones posteriores, las excepciones que enumeras en la cláusula catch deben ser disjuntas. Esto significa que no deben tener relación de herencia. Si una excepción es una subclase de otra, se producirá un error de compilación.{ Ten en cuenta que una cláusula multicatch se vuelve inconexa si un bloque catch precedente puede atrapar la misma clase de excepción. }
    • Parámetro catch final: En un bloque catch múltiple, el parámetro catch es efectivamente final. Eso significa que no puedes reasignarlo dentro del bloque catch. Intentarlo genera un error de compilación.
    Comprobemos estas reglas con algunos ejemplos de código:Ordenación incorrecta de los bloques catch:
    try { int data = 50/0; }    
    catch (Excepción e){ System.out.println(e); }
    catch
    (ArithmeticException e) { System.out.println(e); } Cuando
    intentes ejecutar el código anterior, el compilador de Java te indicará que hay un bloque catch inalcanzable porque el bloque catch para ArithmeticException es inalcanzable. Ordenación correcta de los bloquescatch: try { int datos = 50/0;
    }   
    catch (ArithmeticException e) { System.out.println(e); } catch (Exception e){ System.out.println(e); }
    En el código revisado, atrapas primero la ArithmeticException más específica, seguida de la Exception de tipo más general. Estas reglas defienden el principio de manejar las excepciones de una manera que sea a la vez eficiente y robusta, garantizando que tu código Java mantenga altos niveles de rendimiento y fiabilidad.

    Ejemplos prácticos de bloques de captura múltiple de Java

    Es hora de arremangarse y profundizar en algunos ejemplos prácticos de Bloques de Captura Múltiple de Java. Esta sección explicará en detalle cómo implementar bloques catch múltiples en Java utilizando casos sencillos y complejos.

    Ejemplo sencillo de bloques catch múltiples en Java

    Empecemos con un ejemplo sencillo en el que pueden producirse dos tipos de excepciones: ArithmeticException y
    ArrayIndexOutOfBoundsException. try { int arr[] = new int[5]; arr[6] = 30 / 0; // Esta línea lanzará ArithmeticException y ArrayIndexOutOfBoundsException } catch (ArithmeticException e) { System.out.println (
    "No se puede dividir por cero"
    ); } catch (ArrayIndexOutOfBoundsException e) { System.out.println ("Índice de matriz fuera de los límites"); }
    En el bloque de código anterior, si ejecutaras este programa, se produciría la ArithmeticException y el programa terminaría después de imprimir "No se puede dividir por cero". Observa que la excepción ArrayIndexOutOfBoundsException no se gestiona aunque forme parte del código. Esto se debe a que una vez lanzada una excepción y emparejada con un bloque catch, el código restante no se ejecuta.

    Ejemplo avanzado: Capturar en Java varias excepciones en un bloque

    Supón que estás interactuando con una base de datos. Durante esta operación, puedes encontrarte con distintos tipos de excepciones, como ClassNotFoundException (si no se encuentra el controlador de la base de datos) y SQLException (si hay un problema al acceder a la base de datos). Así es como puedes utilizar varios bloques catch para gestionar estas excepciones:
    try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "myuser", "mypassword"); } catch (ClassNotFoundException e) { System.out.println ("No se ha encontrado el controlador de la base de datos: " + e); } catch (SQLException e) { System.out.println ("Error de acceso a la base de datos: " + e); }
    En el código anterior, el bloque try contiene rutinas de conectividad a la base de datos. Si por alguna razón, el intérprete de Java no puede encontrar el controlador de base de datos especificado (com.mysql.jdbc.Driver en este caso), se puede lanzar una ClassNotFoundException. Alternativamente, puede lanzarse una SQLException cuando se produce un error al acceder a la base de datos. Estas excepciones se capturan individualmente y se gestionan mediante sus respectivos bloques de captura. Con varios bloques de captura, estarás mejor preparado para los distintos tipos de excepción que pueda lanzar tu código. Es esencial recordar que estos bloques de captura deben ordenarse desde los tipos de excepción más específicos a los menos específicos para garantizar que el bloque de captura correcto gestiona cada excepción. Para mejorar la estructura y legibilidad del código, Java ha mejorado la gestión de múltiples excepciones en un bloque a partir de Java 7. En lugar de escribir bloques catch separados para manejar cada excepción, puedes manejar más de una excepción en un solo bloque catch, separados por una barra vertical (|).
    try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "myuser", "mypassword"); } catch (ClassNotFoundException | SQLException e) { System.out.println ("Error al acceder a la base de datos: " + e);
    } Esto no sólo ordena tu código, sino que también elimina la necesidad de repetir código idéntico de gestión de errores en cada bloque catch. Ahora, si se produce una ClassNotFoundException o una SQLException, el bloque catch combinado se encargará de ello, agilizando el proceso de gestión de excepciones.

    Gestión eficaz de errores con el bloque de captura múltiple Try en Java

    Nunca se insistirá lo suficiente en la importancia de una sólida gestión de errores en la programación Java. Dado el uso de Java en una amplia gama de aplicaciones, desde aplicaciones web a soluciones autónomas, una gestión eficaz de los errores puede afectar significativamente a la fiabilidad y eficacia de tu software. La función de bloques try-catch múltiples en Java permite una estrategia de gestión de errores de grano fino, capturando y procesando de forma diferenciada distintos tipos de excepciones.

    Cómo añadir múltiples bloques catch en Java para una mejor gestión de errores

    No es ningún secreto que las capacidades de gestión de errores de Java contribuyen en gran medida a su popularidad. Adoptando la estrategia adecuada, puedes garantizar la resistencia y robustez de tu software. Añadir varios bloques "catch" a un bloque "try" te permite gestionar distintos tipos de excepciones de forma específica, lo que puede ser muy beneficioso para personalizar la notificación y gestión de errores. Es importante tener en cuenta que un bloque "try" puede ir seguido de más de un bloque "catch". La sintaxis de un bloque try-catch te permite añadir cualquier número de bloques catch. Los bloques catch deben seguir directamente al bloque try o a otro bloque catch. Ésta es la sintaxis general para múltiples bloques try catch en Java:
    try { // código que puede lanzar excepciones } 
    catch(tipo_excepcion1 e) { // código de gestión para el tipo_excepción1 } 
    catch(exception_type2 e) { // código de gestión para exception_type2 } // cualquier número de bloques catch adicionales... finally { // opcionalmente, código de limpieza. Este bloque se ejecuta independientemente de que se lance o no una excepción. }
    Aquí, 'exception_type1' y 'exception_type2' son marcadores de posición para clases de excepción reales en Java, como IOException, SQLException o incluso una excepción definida por el usuario. La "e" que sigue al tipo de excepción es el objeto de excepción, que contiene más información sobre el error, como un mensaje explicativo y un seguimiento de la pila. Cuando se produce un error dentro del bloque try, Java detiene la ejecución y comprueba los bloques catch de arriba abajo. Empareja la excepción con el primer bloque catch que coincida con el tipo de excepción, ejecutando el código de gestión de errores correspondiente. El resto de los bloques catch se ignoran en esta ejecución. Por ejemplo, supongamos que tenemos un bloque try, seguido de dos bloques catch que capturan una ArithmeticException y una ArrayIndexOutOfBoundsException, respectivamente. Ahora, si se produce una ArithmeticException dentro del bloque try, se ejecuta el primer bloque catch y se ignoran los bloques catch posteriores. Es crucial recordar que debes ordenar cuidadosamente tus bloques catch, de lo específico a lo general. Si un bloque catch para una excepción general (como Exception) se coloca antes que un bloque catch para una excepción específica (como IOException), el compilador generará un error, ya que el código se volvería inalcanzable. He aquí un ejemplo para aclararlo:
    try { // algo de código arriesgado } catch(Exception e) { // atrapa todo tipo de excepciones. Exception' es una superclase de todas las excepciones } catch(IOException e) { // nunca se llegará a este bloque, porque 'IOException' es una subclase de 'Exception' }
    En el fragmento anterior, se lanza un error de "código inalcanzable" porque nunca se llegará al bloque catch de IOException. El bloque catch anterior que atrapa todas las excepciones, incluida una IOException, lo sustituye.

    El impacto de la gestión inteligente de errores en la programación Java

    La gestión estratégica de errores puede mejorar enormemente la resistencia y la experiencia de usuario de tus programas Java. Una gestión adecuada de las excepciones puede suponer la diferencia entre que una aplicación se bloquee y que se recupere con elegancia de un error y proporcione al usuario un mensaje útil. Añadir varios bloques de captura en Java es una forma eficaz de proporcionar una gestión de errores personalizada en función del tipo específico de excepción que se lance. Permite una mayor flexibilidad y control sobre la gestión de errores.

    Un error común entre los programadores principiantes es creer que el "catch" de un bloque catch significa que de alguna manera evita las excepciones. Esto no es así. El bloque catch sólo proporciona una forma de responder a las excepciones y continuar la operación: los errores ya se han producido cuando el bloque catch obtiene el control.

    Un tratamiento eficaz de las excepciones, incluido el uso de varios bloques de captura, puede mejorar las capacidades de diagnóstico y depuración del software, ya que puede proporcionar información de error detallada y específica del contexto. También puede mejorar la fiabilidad del software al permitirle seguir funcionando incluso en circunstancias "excepcionales". Además, ayuda a evitar la exposición de datos sensibles que podrían presentarse en una traza de pila si una excepción no se maneja adecuadamente. Comprender las excepciones y el manejo de errores en Java, incluido el uso de múltiples bloques catch, es fundamental para crear aplicaciones fiables y robustas. Y a medida que avances en tu viaje por Java, encontrarás aún más formas de optimizar la gestión de errores y mejorar la resistencia y fiabilidad de tu software.

    Bloques de captura múltiple de Java - Puntos clave

    • Los Bloques de Captura Múltiple de Java permiten gestionar diferentes tipos de excepciones dentro del mismo ámbito try con estrategias de gestión de errores individualizadas, lo que conduce a programas Java más robustos y eficientes.
    • A partir de Java 7, se introduce la función "multicatch", que permite manejar más de un tipo de excepción en un único bloque catch. Los distintos tipos de excepción se separan mediante un carácter de tubería (|). Por ejemplo, 'catch (FileNotFoundException | ArithmeticException e) {}'.
    • El proceso de gestión de errores mediante bloques catch múltiples en Java consiste en identificar las posibles excepciones que podría lanzar tu código, encapsular el código dentro de un bloque try y crear bloques catch distintos para cada tipo de excepción identificado.
    • Los bloques catch múltiples en Java son capaces de manejar código antiguo, incluso si el programa Java está llamando a un método de una biblioteca o a un fragmento de código antiguo que carece de documentación exhaustiva sobre excepciones.
    • La "captura múltiple" en Java sólo funciona con excepciones disjuntas, es decir, excepciones que no están en una cadena de herencia, para evitar situaciones de código inalcanzable.
    Aprende más rápido con las 15 tarjetas sobre Bloques de captura múltiple en Java

    Regístrate gratis para acceder a todas nuestras tarjetas.

    Bloques de captura múltiple en Java
    Preguntas frecuentes sobre Bloques de captura múltiple en Java
    ¿Qué son los bloques de captura múltiple en Java?
    Los bloques de captura múltiple en Java permiten manejar diferentes tipos de excepciones usando múltiples cláusulas catch después de un solo bloque try.
    ¿Cómo funcionan los bloques de captura múltiple en Java?
    Los bloques de captura múltiple funcionan probando una sección de código en el bloque try, y capturando distintas excepciones en cada bloque catch correspondiente.
    ¿Puedo capturar múltiples excepciones en un solo catch en Java?
    Sí, en Java se pueden capturar múltiples excepciones en una sola cláusula catch usando el operador '|' para separar los tipos de excepción.
    ¿Cuál es la ventaja de usar bloques de captura múltiple en Java?
    La ventaja es que simplifican el manejo de excepciones, haciéndolo más legible y manejable al permitir capturar diferentes excepciones en un solo bloque try.
    Guardar explicación

    Pon a prueba tus conocimientos con tarjetas de opción múltiple

    ¿Cuál es la función de los Bloques de Captura Múltiple de Java?

    ¿Cómo afecta el orden de los bloques catch al tratamiento de las excepciones en Java?

    ¿Cómo mejoran los Bloques de Captura Múltiple de Java la legibilidad y la eficacia del código?

    Siguiente

    Descubre materiales de aprendizaje con la aplicación gratuita StudySmarter

    Regístrate gratis
    1
    Acerca de StudySmarter

    StudySmarter es una compañía de tecnología educativa reconocida a nivel mundial, que ofrece una plataforma de aprendizaje integral diseñada para estudiantes de todas las edades y niveles educativos. Nuestra plataforma proporciona apoyo en el aprendizaje para una amplia gama de asignaturas, incluidas las STEM, Ciencias Sociales e Idiomas, y también ayuda a los estudiantes a dominar con éxito diversos exámenes y pruebas en todo el mundo, como GCSE, A Level, SAT, ACT, Abitur y más. Ofrecemos una extensa biblioteca de materiales de aprendizaje, incluidas tarjetas didácticas interactivas, soluciones completas de libros de texto y explicaciones detalladas. La tecnología avanzada y las herramientas que proporcionamos ayudan a los estudiantes a crear sus propios materiales de aprendizaje. El contenido de StudySmarter no solo es verificado por expertos, sino que también se actualiza regularmente para garantizar su precisión y relevancia.

    Aprende más
    Equipo editorial StudySmarter

    Equipo de profesores de Ciencias de la Computación

    • Tiempo de lectura de 21 minutos
    • Revisado por el equipo editorial de StudySmarter
    Guardar explicación Guardar explicación

    Guardar explicación

    Sign-up for free

    Regístrate para poder subrayar y tomar apuntes. Es 100% gratis.

    Únete a más de 22 millones de estudiantes que aprenden con nuestra app StudySmarter.

    La primera app de aprendizaje que realmente tiene todo lo que necesitas para superar tus exámenes en un solo lugar.

    • Tarjetas y cuestionarios
    • Asistente de Estudio con IA
    • Planificador de estudio
    • Exámenes simulados
    • Toma de notas inteligente
    Únete a más de 22 millones de estudiantes que aprenden con nuestra app StudySmarter.