Avatar billede william_munny Nybegynder
12. januar 2005 - 12:54 Der er 27 kommentarer og
1 løsning

Kast Exceptions fra Innerclass

Hej Eksperter,
jeg benytter swingworker klassen i min gui, den kalder nogle metoder som smidder en masse exceptions.
Nu er jeg så ved at lave noget exceptions handling, og det skaber nogle problemer da jeg ikke fanger exceptions inde i selve construct() men længere ude. Det mener min compiler ikke at jeg må så hvad gør jeg så?

try
{
    andre iffer....
    if(source == jButtonValidate)
    {
        final SwingWorker worker = new SwingWorker()
        {
            public Object construct()
            {
                //denne linie smidder en masse exceptions
                jctl.ctlValidate(jTextFile.getText(), (Template)jComboTemplates.getSelectedItem());
                jButtonMakeScript.setEnabled(ctl.ctlGetValidatedStatus());
                jEditorPaneMsg.setCaretPosition(0);
                jProgressBar1.setIndeterminate(false);
       
                if(ctl.ctlIsLinks())
                {
                    ctl.ctlDrawWorkflow();
                }
       
                return "test";
            }
        };
       
        worker.start();
    }
catch(Exception e){System.out.println(e);}
Avatar billede kalp Novice
12. januar 2005 - 12:59 #1
mangler du ikke en } ?
Avatar billede kalp Novice
12. januar 2005 - 13:01 #2
try
{
    andre iffer....
    if(source == jButtonValidate)
    {
        final SwingWorker worker = new SwingWorker()
        {
            public Object construct()
            {
                //denne linie smidder en masse exceptions
                jctl.ctlValidate(jTextFile.getText(), (Template)jComboTemplates.getSelectedItem());
                jButtonMakeScript.setEnabled(ctl.ctlGetValidatedStatus());
                jEditorPaneMsg.setCaretPosition(0);
                jProgressBar1.setIndeterminate(false);
       
                if(ctl.ctlIsLinks())
                {
                    ctl.ctlDrawWorkflow();
                }
       
                return "test";
            }
        };
       
        worker.start();
    }
}
catch(Exception e){System.out.println(e);}


og prøv den her



try
{
    andre iffer....
    if(source == jButtonValidate)
    {
        final SwingWorker worker = new SwingWorker()
        {
            public Object construct()
            {
                //denne linie smidder en masse exceptions
                jctl.ctlValidate(jTextFile.getText(), (Template)jComboTemplates.getSelectedItem());
                jButtonMakeScript.setEnabled(ctl.ctlGetValidatedStatus());
                jEditorPaneMsg.setCaretPosition(0);
                jProgressBar1.setIndeterminate(false);
       
                if(ctl.ctlIsLinks())
                {
                    ctl.ctlDrawWorkflow();
                }
       
                return "test";
            }
        }
       
        worker.start();
    }
}
catch(Exception e){System.out.println(e);}


(har ikke sovet så meget i nat.. så måske snakker jeg sort hehe)
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:01 #3
Jo nok fordi jeg klippede det sammen. min compiler besked:

script/gui/Form.java [366:1] unreported exception java.io.IOException; must be caught or declared to be thrown
jEditorPaneMsg.setText(ctl.ctlValidate(jTextFile.getText(),(Template)jComboTemplates.getSelectedItem()));
                                      ^
Avatar billede kalp Novice
12. januar 2005 - 13:03 #4
hvis du i

public static void main(String[] args)

skriver

public static void main(String[] args) throws Exception


så får du den i hvertfald ikke hehe
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:03 #5
kalp ->Hehe
den brokker sig dog stadig :-(
Avatar billede kalp Novice
12. januar 2005 - 13:04 #6
det lyder som om det er fordi der en metode som kalder på noget som kan lave exceptions.. den metoder som kalder skal lige have en throws Exception.. hvis du gør det i main som jeg skrev før så mener jeg ikke den gør det mere.. medmindre fejlen er noget andet!
Avatar billede kalp Novice
12. januar 2005 - 13:05 #7
ellers smid det her ind i sin egen try catch block


//denne linie smidder en masse exceptions
                jctl.ctlValidate(jTextFile.getText(), (Template)jComboTemplates.getSelectedItem());
                jButtonMakeScript.setEnabled(ctl.ctlGetValidatedStatus());
                jEditorPaneMsg.setCaretPosition(0);
                jProgressBar1.setIndeterminate(false);
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:07 #8
Tjae men problemet er at metoden som kaster exceptions er i en indre klasse SwingWorker så hvordan kan jeg sætte den til at kaste videre? eller kan man ikke det, for så må jeg lave strukturen om.. :-(
Avatar billede kalp Novice
12. januar 2005 - 13:10 #9
hmm.. (prøver at ryste hjernen på plads)

hvad sker der hvis du  skriver throws Exception efter dim indre klasses navn?
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:12 #10
script/gui/LIMSEMForm.java [363:1] ';' expected
                    final SwingWorker worker = new SwingWorker()throws Exception
                                                                ^
Avatar billede kalp Novice
12. januar 2005 - 13:20 #11
Det lidt ærgeligt du ikke bruger jdeveloper... kan du dobbelt klikke på fejlmeddelelser hos dig og din markør ender på punktet med fejl?
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:23 #12
Jo og den giver denne linie
final SwingWorker worker = new SwingWorker()throws Exception

Har ikke helt styr på de her inner classes gør det kun pga. af en progress bar.
Avatar billede kalp Novice
12. januar 2005 - 13:26 #13
Avatar billede kalp Novice
12. januar 2005 - 13:28 #14
script/gui/Form.java [366:1] unreported exception java.io.IOException; must be caught or declared to be thrown
jEditorPaneMsg.setText(ctl.ctlValidate(jTextFile.getText(),(Template)jComboTemplates.getSelectedItem()));

var din oprindelig fejl.. og du mangler thrown (har de med på det link jeg fandt.. kunne nemlig ikke finde klassen i API'et)
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:32 #15
Ok nu tabte jeg tråden ??
Avatar billede kalp Novice
12. januar 2005 - 13:37 #16
kan bare se deres eksempel her .

Object doWork() {
  try {
      for(int i = 0; i < NUMLOOPS; i++) {
        updateStatus(i);
        if (Thread.interrupted()) {
            throw new InterruptedException();
        }
        Thread.sleep(500);
      }
  }
  catch (InterruptedException e) {
      updateStatus(0);
      return "Interrupted"; 
  }
  return "All Done";
}


men vil sgu helst ikke forvirre dig:o(
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:40 #17
næe det blev jeg ikke meget klogere af, så skal jeg ikke bare bide i det sure æble og lave Exception handling i Construct().
Avatar billede kalp Novice
12. januar 2005 - 13:42 #18
hmmnjaee måske.. du kan også vente lidt og håbe på at en med 20års programmering kommer herind med lidt guldkorn;)
Avatar billede william_munny Nybegynder
12. januar 2005 - 13:43 #19
uha det med at venter er jeg ikke så god til ARNE hvor er du!! :-)
Avatar billede kalp Novice
12. januar 2005 - 13:53 #20
hehe hver toldmodig;)
Avatar billede arne_v Ekspert
12. januar 2005 - 19:22 #21
Problemet er at SwingWorker construct ikke er erklæret til at throwe nogen exception.

Jeg kan se 3 mulige løsninger:

1)  du catcher exception i construct (kan være uhensigtsmæssig)

2)  du retter SwingWorker construct så den thrower en Exception + alle
    de nødvendige konsekvens rettelser i SwingWorker (en del arbejde og
    måske ikke så pænt) og lader så din construct implementation throwe en Exception

3)  du thrower en unchecked exception altså en exception som extender
    RuntimeException

og #3 virker meget fint.

Men men men ...

Den exception bliver jo ikke catchet i din tråd, fordi den kode køres i en separat tråd.

Og så er du jo lige vidt.

:-(
Avatar billede snoop_one Nybegynder
13. januar 2005 - 00:50 #22
/*
* Created on 2005-01-13
*/

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

/**
* @author Snoop_one
*/
public class SwingWorkerExceptionTester {

    public SwingWorkerExceptionTester() {
        try {
            final SwingWorker worker = new SwingWorker() {
                public Object construct() {
                   
                    try {
                        //denne linie smidder en masse exceptions
                        exceptionMethod();
                    } catch (Exception e) {
                        return e;
                    }

                    return "test";
                }
            };

            worker.start();

            if (worker.get() instanceof Exception) {
                Throwable exp = new InvocationTargetException(
                        (Exception) worker.get()).getTargetException();
                System.out.println("The Exception was a: " + exp +
                        "\n\twith this message: "+ exp.getMessage());
            }
        }

        catch (Exception e) {
            System.out.println(e);
        }

    }

    public void exceptionMethod() throws IOException {
        throw new IOException("Testing");
    }

    public static void main(String[] args) {
        new SwingWorkerExceptionTester();
    }
}

Håber du kan følge tankegangen
Avatar billede william_munny Nybegynder
14. januar 2005 - 10:19 #23
snoop_one -> det ser jo lovende ud kan man ikke smide exceptionen videre her:
if (worker.get() instanceof Exception)
{
    Throwable exp = new InvocationTargetException(
      (Exception) worker.get()).getTargetException();
    System.out.println("The Exception was a: " + exp +
                        "\n\twith this message: "+ exp.getMessage());
}

Så kan man ikke sige throw (Exception) worker.get(); ?
Avatar billede snoop_one Nybegynder
15. januar 2005 - 10:04 #24
Jo altså du kan jo lave den på denne måde hvor du tager dig af exception handling et andet sted, men ved ikke hvor god idé det er? (tegn på design fejl!):

/*
* Created on 2005-01-13
*/

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

/**
* @author Snoop_one
*/
public class SwingWorkerExceptionTester {

    public SwingWorkerExceptionTester() throws IOException {

        final SwingWorker worker = new SwingWorker() {
            public Object construct() {
                try {
                    // denne linie smidder en masse exceptions
                    exceptionMethod();
                } catch (Exception e) {
                    return e;
                }
                return "test";
            }
        };
       
        worker.start();
        if (worker.get() instanceof IOException) {
            throw (IOException) worker.get();
        }
    }

    public void exceptionMethod() throws IOException {
        throw new IOException("Testing");
    }

    public static void main(String[] args) {
        try {
            new SwingWorkerExceptionTester();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede william_munny Nybegynder
21. februar 2005 - 13:06 #25
Har lavet mit design om så jeg slipper for denne problematik så kan folk ikke smide et svar. Og tak for hjælpen.

Og undskyld det har taget så lang tid havde glemt dette spørgsmål. Dette kunne være sejt med en slags reminder funktion her på eksperten eller en 'time to live' på sine spørgsmål..
Avatar billede snoop_one Nybegynder
21. februar 2005 - 22:16 #26
svar
Avatar billede arne_v Ekspert
21. februar 2005 - 22:19 #27
Jeg synes at du skal give snoop alle pointsene for hans gode ide
Avatar billede william_munny Nybegynder
21. februar 2005 - 22:34 #28
Ja det var oxo hans løsning jeg næsten fik til at virke.. så værsgo
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester