2011-09-29 8 views
5

Tengo un n00b/problema básico sobre la captura de prueba en java.Problema de ámbito en una declaración try catch

Ini myIni; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

y el mensaje de error siguiente: variables myIni no podría haber sido inicializado

es el alcance de la única try limita a la zona intentarlo? ¿Cómo puedo obtener el resultado de myIni en el siguiente código?

+0

Do not do 'e.printStackTrace()'. Simplemente "arroja e". – BalusC

Respuesta

6

Para evitar el mensaje, debe establecer un valor predeterminado antes de la instrucción try.
O necesita poner la llamada al método get() en la instrucción try.

+0

hoho, esa era realmente una pregunta n00b entonces :) gracias. – Cornelius

+1

@ Cornelius: incluso las preguntas n00b son útiles;) –

+0

No hay preguntas de novato. – Simeon

0

Simplemente ponga myIni.get ("toto") dentro del bloque try catch, o escriba Ini myIni = null; en la primera fila. Tenga en cuenta que si hace la segunda variante, puede obtener una NullPointerException si el archivo no se encuentra o no se puede leer por cualquier otra razón ...

¡aplausos! P

0

escritura Ini myIni = null; y eso es todo

1

es el alcance de la única try limita a la zona intentarlo? La respuesta es sí. El problema que tienes es que te has olvidado de inicializar tu objeto.

Prueba esto:

Ini myIni=null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Para evitar que su programa desde que recibe NullPointerException, realizando una comprobación para asegurarse de que la llamada dentro del bloque try resultó en el Objeto sido construido con algunos datos.

if(myIni !=null) 
{ 
    myIni.get("toto"); 
} 

alternativa si no desea llamar myIni fuera del bloque try/catch ya que si se produce una excepción, el objeto, en efecto, null, entonces usted puede hacer de la siguiente manera.

try { 
    Ini myIni= new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
0

En la sentencia catch, no se define el valor de la variable. Por lo tanto, la variable no tendrá un valor si captura y ejecuta myIni.get("toto");. Lo que quiere hacer algo como esto:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

A pesar de ello, obtendrá una NPE cuando se ejecuta get().

2

En su la forma correcta de hacer lo que quiere es poner myIni.get("toto"); dentro del bloque try:

try { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

No haga Ini myIni = null; como sugirieron algunas respuestas. En este caso, su código arrojará NullPointerException, si se lanza un IOException en la inicialización de myIni.

+0

no si comprueba null antes de la línea 'myIni.get (" toto ");' – Simeon

4

Sí, el alcance de la prueba se limita a eso.De hecho el alcance comienza con {y termina con}, por lo tanto esto también sería crear un sub-ámbito

void foo() { 
    { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    } 

    myIni.get("toto"); //error here, since myIni is out of scope 
} 

Para solucionar el problema, inicializar myIni con nula, y tenga en cuenta que si falla el intento, myIni.get("toto"); resultaría en una NullPointerException.

Por lo tanto, necesitaría dar cuenta de eso o lanzar otra excepción desde su bloque catch.

comprobar NULL:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

if(myIni != null) { 
    myIni.get("toto"); 
    //access the rest of myIni 
} else { 
    //handle initialization error 
} 

Throw excepción:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
    throw new MyCustomInitFailedException(); //throw any exception that might be appropriate, possibly wrapping e 
} 

myIni.get("toto"); 

Como ya se ha sugerido por @khachik también se puede poner el bloque try alrededor de toda su uso de myIni si eso es posible y apropiado. La solución que elijas depende de tus otros requisitos y tu diseño.

1

Este es el camino del compilador para decir que la inicialización de myIni puede fallar. Porque la línea myIni = new Ini(new FileReader(myFile)); podría arrojar una excepción.

Si falla al llegar a la línea myIni.get("toto");myIni no se habría inicializado.

tienes 2 opciones:

  1. poner el myIni.get("toto"); dentro del bloque try.
  2. Asigne un valor inicial de null a myIni cuando lo defina y busque null fuera del bloque try.
0

En su código, si ocurre una excepción, la variable myIni no se pudo crear una instancia, es por eso que el compilador genera dicha advertencia.

se puede cambiar a:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
if(myIni!=null){ 
myIni.get("toto"); 
} 
0

Como @khachik señaló, lo mejor es declarar e inicializar la variable dentro del propio bloque try. Inicializa como abajo, fuera del try bock solo si sientes una confianza suprema que es indistinguible de la arrogancia.

Ini myIni = null;