Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Ifrit
    Registrato dal
    Oct 2005
    Messaggi
    116

    [Java] Cast dopo una instanceof

    Salve a tutti.

    Oggi leggendo la guida a jsp mi sono imbattuto in una parte di codice che non riesco a capire a livello logico.

    La pagina di riferimento è la seguente: link

    nella classe jrun__prova2ejspa è presente un try-catch che esegue un controllo e a un successivo cast sul tipo di classe catturata, ovvero:

    codice:
        try {
          out.print("<!-- PROVA.JSP-->rnrn<html>rnrn<body>rnrn");
          out.println ("PRIMA PROVA JSP");
          out.print("rnrn</body>rnrn</html>");
        } catch(Throwable t) {
          if(t instanceof ServletException) throw (ServletException) t;
          if(t instanceof java.io.IOException) throw (java.io.IOException) t;
          if(t instanceof RuntimeException) throw (RuntimeException) t;
          throw JRunJSPStaticHelpers.handleException(t, pageContext);
        } finally {
          __jspFactory.releasePageContext(pageContext);
        }
    il segmento di codice che mi lascia perplesso è il seguente:

    codice:
          if(t instanceof ServletException) throw (ServletException) t;
          if(t instanceof java.io.IOException) throw (java.io.IOException) t;
          if(t instanceof RuntimeException) throw (RuntimeException) t;


    la domanda è: perche' dopo che ho verificato che t sia una istanza di tipo T, la rilancio facendo un cast?

    da quello che so (quindi molto probabilmente sbaglio) l'istanza puntata dall'handler t si porta sempre dietro il suo tipo, proprio perche' java è un linguaggio a binding dinamico... pertanto mi sembra inutile il cast.
    Sbaglio?? se si, perche'? non avrebbe piu' senso una catch scritta in questo modo:


    codice:
        try {
          out.print("<!-- PROVA.JSP-->rnrn<html>rnrn<body>rnrn");
          out.println ("PRIMA PROVA JSP");
          out.print("rnrn</body>rnrn</html>");
        } catch(Throwable t) {
          if( t instanceof ServletException || 
              t instanceof java.io.IOException || 
              t instanceof RuntimeException) {
                   throw t; // t rimane sempre e comunque una classe di tipo Throwable, quindi rilanciabile
           } else {
                   throw JRunJSPStaticHelpers.handleException(t, pageContext);
           }
        } finally {
          __jspFactory.releasePageContext(pageContext);
        }
    con tutto lo spaghetti code che rimuoverei.. ma vabo' quello è un altro complesso che non c'entra con l'argomento del topic....
    spero che qualcuno mi possa rispondere a questo dubbio esistenziale =D
    Grazie in anticipo ^^


    edit:
    maledizione non ho visto il subforum java =( chiedo scusa..
    Un moderatore puo' spostarmi la discussione perfavore? chiedo ancora scusa =(
    Ultima modifica di Ifrit; 02-05-2015 a 18:31
    codice:
     $(".canaglia").show()

  2. #2
    Utente di HTML.it L'avatar di Ifrit
    Registrato dal
    Oct 2005
    Messaggi
    116
    up =X

    nessuno mi sa togliere sto dubbio esistenziale?
    codice:
     $(".canaglia").show()

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Il codice che hai postato è in un metodo

    public void _jspService(HttpServletrequest request, HttpServletresponse response) throws ServletException, java.io.IOException

    Se questo _jspService (che non è standard, cioè è sicuramente dipendente dal container) è comunque un override e la versione "super" dichiara solo ServletException e IOException, allora giustamente, per le regole di Java, l'override NON può dichiarare eccezioni "checked" più "ampie".
    Pertanto non si può far uscire Throwable, e questo in sostanza è il motivo per cui quel codice testa in modo preciso le eccezioni e soprattutto perchè restringe il tipo statico della eccezione da rilanciare.
    Ultima modifica di andbin; 07-05-2015 a 23:18
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di Ifrit
    Registrato dal
    Oct 2005
    Messaggi
    116
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il codice che hai postato è in un metodo

    public void _jspService(HttpServletrequest request, HttpServletresponse response) throws ServletException, java.io.IOException

    Se questo _jspService (che non è standard, cioè è sicuramente dipendente dal container) è comunque un override e la versione "super" dichiara solo ServletException e IOException, allora giustamente, per le regole di Java, l'override NON può dichiarare eccezioni "checked" più "ampie".
    Pertanto non si può far uscire Throwable, e questo in sostanza è il motivo per cui quel codice testa in modo preciso le eccezioni e soprattutto perchè restringe il tipo statico della eccezione da rilanciare.
    ecco cosa mi era sfuggiro =) perfetto grazie infinite ^^
    codice:
     $(".canaglia").show()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.