una - propagacion de excepciones en java
Mensaje de error "excepción no reportada java.io.IOException; debe ser atrapado o declarado para ser arrojado " (5)
Cuando la persona que llama emite una excepción, es decir, anula el showfile () lanza la excepción java.io.IOException, la persona que llama debe manejarlo o lanzarlo nuevamente.
Y también aprender convenciones de nomenclatura. Un nombre de clase debe comenzar con una letra mayúscula.
Error:
filecontent.java:15: excepción no reportada java.io.IOException; debe ser atrapado o declarado para ser lanzado
Mostrar archivo(); ^ filecontent.java:78: excepción no reportada java.io.IOException; debe ser atrapado o declarado para ser lanzado
Mostrar archivo(); ^
Ya he lanzado java.io.IOException, pero aún muestra estos errores.
Mi código:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class filecontent extends Frame implements ActionListener
{
TextField t[] = new TextField[4];
TextArea ta[] = new TextArea[4];
Button submit;
Panel p1;
filecontent()
{
setGUI();
setRegister();
showfile();
setTitle("FileData");
setVisible(true);
setSize(300, 300);
/* addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
*/
}
void setGUI()
{
p1 = new Panel();
p1.setLayout(new GridLayout(5, 4, 10, 10));
for(int i=0; i<4; i++)
{
t[i] = new TextField(10);
ta[i] = new TextArea("");
p1.add(t[i]);
p1.add(ta[i]);
}
submit = new Button("Submit");
p1.add(submit);
}
void setRegister()
{
submit.addActionListener(this);
}
void showfile() throws java.io.IOException
{
FileReader fin[] = new FileReader[4];
FileReader fn;
// br[]=new BufferedReader[4];
for(int i=0;i<4;i++)
{
fin[i]=new FileReader(t[i].getText());
}
int cnt = 1;
String s;
fn = fin[0];
BufferedReader br = new BufferedReader(fn);
while(cnt <= 4)
{
if((s=br.readLine()) != null)
{
ta[cnt-1].append(s+"");
}
else
{
cnt++;
fn = fin[cnt-1];
ta[cnt-1].setText("");
}
}
}
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource()==submit)
{
showfile();
}
}
public static void main(String ar[])
{
new filecontent();
}
}
El mensaje de error significa que cualquier método que llame a showfile()
debe declararlo que, a su vez, lanza la IOException
, o la llamada debe estar dentro de un bloque try
que atrapa la IOException
. Cuando llamas a showfile()
, no haces ninguno de estos; por ejemplo, su constructor de contenido de filecontent
no declara la IOException
ni contiene un bloque try
.
La intención es que algún método, en algún lugar, contenga un bloque try
, y capture y maneje esta excepción. El compilador está tratando de obligarte a manejar la excepción en algún lugar.
Por cierto, este código es (lamento ser tan directo) horrible . No cierra ninguno de los archivos que abre, el BufferedReader
siempre apunta al primer archivo, aunque parezca que intenta hacer que apunte a otro, los bucles contienen errores off-by-one que causarán varias excepciones. Cuando logres compilar esto, no funcionará como esperas. Creo que necesitas reducir la velocidad un poco.
Las excepciones suben en la pila. Si un llamante llama a un método que lanza una excepción marcada, como IOException, también debe capturar la excepción o, por sí mismo, lanzarla.
En el caso del primer bloque:
filecontent()
{
setGUI();
setRegister();
showfile();
setTitle("FileData");
setVisible(true);
setSize(300, 300);
/*
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
*/
}
Tendrías que incluir un bloque try catch:
filecontent()
{
setGUI();
setRegister();
try {
showfile();
}
catch (IOException e) {
// Do something here
}
setTitle("FileData");
setVisible(true);
setSize(300, 300);
/*
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
*/
}
En el caso del segundo:
public void actionPerformed(ActionEvent ae)
{
if (ae.getSource() == submit)
{
showfile();
}
}
No puede lanzar IOException desde este método ya que su firma está determinada por la interfaz, por lo que debe detectar la excepción dentro de:
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource()==submit)
{
try {
showfile();
}
catch (IOException e) {
// Do something here
}
}
}
Recuerde, el método showFile () está lanzando la excepción; eso es lo que la palabra clave "lanza" indica que el método puede lanzar esa excepción. Si el método showFile () está lanzando, entonces cualquier llamada de código que el método deba capturar, o ellos mismos lanzan la excepción explícitamente al incluir la misma excepción IOException de lanzamientos a la firma del método, si está permitido.
Si el método está anulando una firma de método definida en una interfaz o superclase que no declara también que el método puede lanzar esa excepción, no puede declarar que arroje una excepción.
Su método showFile () declara que puede lanzar una excepción IOException. Dado que esta es una excepción marcada, cualquier método de llamada a showFile () debe manejar la excepción de alguna manera. Una opción es ajustar la llamada a showFile () en un bloque try-catch.
try {
showFile();
}
catch(IOException e) {
// Code to handle an IOException here
}
void showfile() throws java.io.IOException <-----
Su método showfile()
lanza la IOException
, por lo que cada vez que lo use debe capturar esa excepción o, nuevamente, torcerla. Algo como:
try {
showfile();
}
catch(IOException e) {
e.printStackTrace();
}
Deberías aprender acerca de las excepciones en Java .