Error de carga de imágenes

Si no está en un subproceso de despachador de eventos (como cuando se presiona un botón en la interfaz de usuario), su aplicación no se bloqueará. Bloqueará el hilo, que se desasignará, no obtendrá la imagen pero su aplicación estará viva.

Existe la posibilidad de crear un subproceso: o extenderá un subproceso y anulará el método run () o creará una interfaz Runnable y se lo dará a un constructor de subprocesos.

BufferedImage img = null;
try {
    img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}catch(OutOfMemoryError err){
// your code will be here :)
}

Intente depurar / registrar su código antes de ingresar en la función de carga de imágenes para ver cuánto es su memoria máxima asignable:

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();

Si tiene 50 MB libres y el archivo es de 50 MB, entonces no hay razón para intentar cargar.

Respuesta 1

¿Qué hacer para detectar cuán grande es la imagen que puedo cargar, o no simplemente salir?

Puede haber bibliotecas que le permitan determinar el ancho y la profundidad de color de las imágenes leyendo el encabezado, pero nada en el J2SE lo hará de forma inmediata.

Otro enfoque "desde la otra dirección" es adoptar un enfoque defensivo para cargarlos. Esta técnica se describe en código en esta respuesta, pero se puede resumir como:

  • reservar un búfer de memoria
  • preparar un panel de advertencia de memoria por adelantado
  • hacer la tarea 'memoria intensiva'
  • activado OutOfMemoryError: proporciona a la máquina virtual un poco de "espacio de respiración" de memoria al borrar el búfer
  • decirle al usuario qué salió mal y cómo solucionarlo
Respuesta: 2

En el siguiente código, los campos miembros del valor ENUM GREEN de Colors no son accesibles fuera de la definición enum: public class Test {enum Colors {RED, GREEN {...

Estoy integrando Weld 3.1.0 en mi aplicación. Mi aplicación ya tiene una dependencia con la biblioteca de API de anotación Javax. Me di cuenta de que la implementación de soldadura (Core) define una dependencia ...

Estoy tratando de descubrir cómo usar la entrada y salida de los usuarios de cierta información dependiendo de la entrada del usuario. ¿Alguien puede proporcionar un ejemplo simple del uso del patrón decorador para una pizza simple ...

Tengo tres proyectos de gradle. Diga ProjectA, ProjectB y ProjectC. ProjectC depende de ProjectA y ProjectB. Mientras que ProjectB depende de ProjectA. Entonces, build.gradle de ProjectC tiene el ...