Вынуждать отпустило catch

Есть какой-то способ вынуждать разрыв, не вызывая исключения, от внутреннего помещения try до catch? Например:

try {

    // Código
    // ...
    //

    //Provocar salto al "catch" -> ¿otra opción?
    Integer.parseInt( "hola" );

} catch( Exception e ) {

    // Código
    // ...
    //
}

То, что я пробую сделать, так это следующее:

Программа просит выбор числа выбора, давайте помещать с 1 до 5. Как я жду число, делаю превращение в тип int из ввода внутри try, если он не удается, показываю сообщение и звоню recursivamente в функцию, до тех пор, пока он не получает действительное число. Или вне try-catch (или у меня есть число), я подтверждаю, что это число внутри интервала, другой формы, я снова показываю сообщение, и так называемый переиталик... то, что он хотел, состояло в том, чтобы помещать эту проверку в try, после превращения и отпускать catch, если число не было между ожидаемыми, из-за того, что избавлял от линий. То, что у меня есть, функционирует, но я хочу улучшить это.

Следовательно то, что я хочу узнать, - это как вынуждение разрыва во внутреннее помещение catch, не вынуждая исключения, если есть какая-то предвиденная форма.

5
задан 20.12.2016, 02:11
9 ответов

ВїHay какой-то способ вынуждать разрыв, не вызывая одной excepciГіn, с внутреннего помещения try в catch?

не могут вынуждать ее ejecuciГіn catch, если в себя не бросил один Throwable, а именно одну excepciГіn или ошибка, внутри нее secciГіn try.

Это себе объясняют очень хорошо в JLS 14. Blocks and Statements 14.20. The try statement 14.20.1. Execution of try-catch и 14.20.2. Execution of try-finally and try-catch-finally

5
ответ дан 24.11.2019, 11:59
  • 1
    С моей точки зрения, для которого спрашивает OP, единственный действительный ответ - ответ Luiggi, так как о нем упоминают, что не была спровоцирована excepció n – jasilva 21.12.2016, 00:21

Для этого случая он рекомендовал бы тебе создавать собственные исключения увеличивая класса Exception следующей формы:

public class ExcepcionPropia extends Exception {
    public ExcepcionPropia(String mensaje) {
        super(mensaje);
    }
}

оставаясь твой код следующей формы:

try{
     if (numEntrada == valor) {
          throw new ExcepcionPropia();
     }
}catch(ExcepcionPropia e){
     // Aqui recoges la excepcion que has forzado
}catch(Excepcion e){
     // Aqui se recogen las demás excepciones
}

в котором ты сможешь заканчиваться try-catch когда не будет выполнено, что numeroEntrada был равен желанной стоимости, бросая, таким образом, собственное исключение и подбирая ее в блоке catch корреспондент, выполняя действия, желаемые внутри этого блока.

4
ответ дан 24.11.2019, 11:59
  • 1
    В твоем có я говорю, что ты скроллируешь excepció n внутри try, и é l проси, чтобы он был сделан извне, сшил, что не возможно. – Maguz 20.12.2016, 18:42
  • 2
    @maguz сам ha это " ¿ Есть какой-то способ вынуждать разрыв, не вызывая excepció n, от внутреннего помещения try до catch? " равный я это интерпретировал плохо, но он помещает с внутреннего помещения try-catch ú nico, что мой ответ вынуждает бросать excepció n, но не вызывая excepció n я думаю, что не является возможным то, что он просит – Joacer 20.12.2016, 18:46
  • 3
    вся razó n, я извиняюсь – Maguz 20.12.2016, 22:23
  • 4
    спокойный, он ничего не перемещает, tambié n podí я когда это интерпретировал плохо. Привет! – Joacer 21.12.2016, 10:23

Хорошие.

Ты можешь бросать исключение с любой части программы, не импортируя, если она захвачена одним catch. Чтобы это делать ты должен создавать исключение и бросать ее с размещенным словом throw следующего способа:

throw new EmptyStackException();

Это сделает, что блок catch с подходящим типом исключения работайте. Для этого он ищется согласно батарейке призывов к блоку, который может захватывать это, если нет, виртуальная Машина закончит выполнение программы, когда ему не удается обработать ошибку (распространение исключений, What is exception propagation?).

Считай следующее изображение:

Jerarquía de Errores en Java

Ты можешь бросать с thow любой класс, который был бы дочерью Throwable. Если ты хочешь бросить исключение типа Exception но ты она не хочешь обработать дебет заявлять в функции, где встречается excecion, который нужно захватывать в верхнем уровне (это не необходимо для детей RuntimeException), это следующего способа:

public void FuncionQueNoProcesaExcepciones throws Exception, 
                                                  MiException {
    // ...
}

Сейчас, если ты хочешь захватить исключение, структура драйвера исключений содержит размещенные слова try, catch, finally. структура - следующая:

try {
    // codigo que podría lanzar excepciones. Puedes ser distintos
    // tipos como IOException, IndexOutOfBoundsException
} catch (IOException excepcion){
    // Este bloque solo se ejecuta cuando se lanza una excepcion 
    // del tipo IOException
} catch (IndexOutOfBoundsException excepcion){
    // Este bloque solo se ejecuta cuando se lanza una excepcion 
    // del tipo IndexOutOfBoundsException
} finally {
    // siempre se llama a finally, haya una excepcion o no.
}

Осветляя функцию блока try-catch, отвечая в:

Есть какой-то способ вынуждать разрыв, не вызывая исключения, от внутреннего помещения try до catch?

Это выборы:

  • Использовать throw чтобы выполнять catch. Это достает тебя из нормальной разгрузки программы.
  • Использовать метод в catch, так что было возможно звонить, не бросая исключения. Таким образом, ты можешь называть это с любой части, даже внутри try (очевидным является метод).

    public static void main(String[] args) {
        String texto = "Desde el try";
        try {
            // codigo
            procesaExcepcion(texto);
    
            // si se llamara desde el catch ...
            throw new Exception();
        } catch (Exception c) {
            texto = "Desde el catch";
            procesaExcepcion(texto, c);
        }
    }
    
    public static void procesaExcepcion(Object... contexto) {
        // hacer cosas para procesar la excepcion
        System.out.println(contexto[0]);
    }
    
  • Использовать функции отражения и рамы работы для манипуляции bytecodes (это единственный способ выполнять catch не бросая исключения), но это не ни для чего легко.

Сейчас, твоя проблема не нуждается в так называемом переиталике

"я показываю сообщение и звоню recursivamente в функцию"

Правильный способ санкционировать ввод - посредством использования цикла do-while, следующего способа

java.util.Scanner sc = new java.util.Scanner(System.in);
int variable = -1;

do {
    try {
        System.out.print("Ingrese una opcion: ");
        variable = Integer.parseInt( sc.nextLine() );
    } catch( NumberFormatException e ) {
        // no es necesario poner algo aqui
    }
} while (variable < 1 || variable > 5);

System.out.print(variable);

Код наверху объявляет и инициализирует переменную, которая сохраняет число, которое ты хочешь санкционировать. Попробовав конвертировать с parseInt есть два выбора: он превращается или бросает исключение.

  • Если он превращается, while цикла санкционирует, что он находился между желанной стоимостью, если не, вновь читают ввод.
  • В случае исключения, переменная стоит-1, из-за которого это не действительная стоимость и повторяется цикл.

Сейчас, если ты хочешь более короткий код, ты можешь менять блок:

try {
        System.out.print("Ingrese una opcion: ");
        variable = Integer.parseInt( sc.nextLine() );
} catch( NumberFormatException e ) {
        // no es necesario poner algo aqui
}

из-за

while (!sc.hasNextInt()) sc.next();
variable = sc.nextInt();

В конце концов, если у тебя есть проблемы с линиями ;) всегда ты можешь писать все в одной без места:

Scanner s=new Scanner(System.in);
int v=-1;do{while(!s.hasNextInt())s.next();v=s.nextInt();}while(v<1||v>5);
4
ответ дан 24.11.2019, 11:59

Функция try... catch

В части try это секция кода, где она или решения попробуют захватывать возможную ошибку. Если он случается, нужно захватывать, где появляется часть catch. Пример:

try{
     // Instrucciones que se intentan ejecutar, Si se produce una
     // situación inesperada se lanza una excepción.
}catch(tipoExcepcion e){
     // Instrucciones para tratar esta excepción.
}catch(otroTipoExcepcion e){
     // Instrucciones para tratar esta excepción.
}

Если querés вынуждать ошибку, потому что вмешалось плохо число, не надо, чтобы он был внутри try... catch. Функция try catch не стоит использовать это для этого случая. Ты мог бы добавлять if, чтобы видеть, что он не выполняет ожидаемую стоимость, и показывать сообщение показывая это.

Пример:

if(numero >= 6){
    System.out.println("Numero incorrecto!!!");
}
1
ответ дан 24.11.2019, 11:59

Конец одного try-catch - Г©ste, если то, к чему стремятся, состоит в том, чтобы не стал совсем не прибывшим случай так как просто, оставлять это vacГ - или:

try{
}catch(SomeException e){}

, Хотя во мне opiniГіn он не рекомендуется, так как в таком случае имения неожиданного поведения, Г©stas исключения - те, которым они помогают нам отлаживать cГіdigo.

, Если то, что он хочет, состоит в том, чтобы отпускать catch ГљNICAMENTE в случае в особенности, немного сходно с одним break xyz; для одной iteraciГіn, это не является возможным.

0
ответ дан 24.11.2019, 11:59

Ты можешь бросать исключение с

throw new Exception (); Но мне кажется, что лучшее состоит в том, чтобы ты сделал метод с тем, что ты нуждаешься в том, чтобы сделать в неудаче, или методе, чтобы знать, что делать в try, это, чтобы улучшать чтение

try {

    // Código
    // ...
    //

    //Provocar salto al "catch" -> ¿otra opción?
   int valor= Integer.parseInt( tuCadenaConNumero );
   if(valor<1 || valor> 5)
      mandarErrorYRegresar(tuCadenaConNumero );

} catch( Exception e ) {
    mandarErrorYRegresar(tuCadenaConNumero );
    // Código
    // ...
    //
}

[...]

public void mandarErrorYRegresar(String tuCadenaConNumero ){
   System.out.println("El valor '"+tuCadenaConNumero +"' No es valido");
   //codigo para volver a pedir el numero;
   PedirNumero();
}

или внутри try ты называешь функцию, которая делала бы все утверждения, эта функция посылает исключение, когда что-то не внутри необходимого

0
ответ дан 24.11.2019, 11:59

ВїHay какой-то способ вынуждать разрыв, не вызывая одной excepciГіn, от внутреннего помещения try до catch?

Точно catch создан, чтобы захватывать тип excepciГіn, если ты не производишь ошибку, он не идет вынуждать разрыв в блок catch:

try {

    // Código
    // ...
    //

    //Provocar salto al "catch" -> ¿otra opción?
    Integer.parseInt( "hola" );

} catch( Exception e ) {

    // Código
    // ...
    //
}

Взамен ты можешь бросать одну excepciГіn создавая твой exception:

public class MyCustomExcepcion extends Exception{

    public MyCustomExcepcion(String excute)
    {
        super(excute);
    }
    public String getMessage()
    {
        return super.getMessage();
    }
}

, который usarГ-схвати, таким образом:

 MyCustomExcepcion myCustomException = new MyCustomExcepcion("mi error personalizado.");

    try {    
        ...
        ...
        ...    
        //Provocar salto al "catch" -> ¿otra opción?
        //Integer.parseInt( "hola" );
        //Esta sería la opción:
        throw myCustomExcepcion();

    } catch(MyCustomExcepcion e) {    
       ...
       ...          
    } catch(Exception e) {    
       ...
       ...
    }
0
ответ дан 24.11.2019, 11:59

На основании которого ты пишешь, что ты хочешь сделать мне я ocurriГі решать это следующего способа:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.Scanner;  // needed for Scanner

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        FnConTry();
    }

    public static void FnConTry(){
        try {

            // Codigo
            // ...
            //
            //Solicito un numero
            // 1. Create a Scanner using the InputStream available.
            Scanner scanner = new Scanner( System.in );
            // 2. Don't forget to prompt the user
            System.out.print( "Escribe un numero: " );
            // 3. Use the Scanner to read a line of text from the user.
            String n = scanner.nextLine();
            int numero = 0;

            //Provocar salto al "catch" -> otra opcion?
            numero = Integer.parseInt( n );
             if(numero >= 1 && numero <= 5){
                System.out.println("Numero Valido");
            }
            else{
                System.out.println("El numero no esta en el rango!!");
                FnConTry();
            }

        } catch( Exception e ) {

            System.out.println("\nRecuerde que debe introducir un numero");
            FnConTry();
            // Codigo
            // ...
            //
        }
    }
}

то, что ты говоришь посылания catch, не бросая одной excepciГіn, я не нахожу чувство, не, если ты хочешь избавить от ресурсов или чего-то asГ-..., если тебе удается открыть, как делать это имеет ответ пожалуйста.

0
ответ дан 24.11.2019, 11:59
  • 1
    Я считаю что-то сходным с тем, что ты выдвигаешь, только, что if - else эта despué s try - catch, на данный момент я не нахожу более простой формы или " adecuada" делания этого. – Orici 23.12.2016, 19:25
  • 2
    Ok, если ты находишь, как делание этого :) ты был бы таким любезным обновления, чтобы знать как. – Cristina Carrasco 23.12.2016, 19:49

Хороший как они комментируют это тебе наверху, ты можешь делать один throw new RuntimeException("Mensaje") внутри try и это это идет посылать прямо catch

Я помещаю тебе более ясный пример как делать это прямо

try {

    // Código
    // ...
    //

    If(<<condicion>>)
    {
        throw new RuntimeException("No me gusta este número")
    }
    Integer.parseInt( "hola" );

} catch( Exception e ) {

    // Código
    // ...
    //
}
-1
ответ дан 24.11.2019, 11:59
  • 1
    Привет @Cristian. ¡ Желанный в Стакк Оверфлов в espaГ±ol и спасибо за достигание! Edité твой ответ для того, чтобы esté незазубренная правильно... Но, как добро está s упоминая, сама была часть предварительного ответа, и я не вижу, что esté не добавляя ничего нового с этим ответом, хотя quizá s я ошибся, из-за которого serí в хороший, что ты упомянул о том, если cuá l serí в различие, с которым уже respondió – Mariano 20.12.2016, 21:36

ты можешь выполнять вынуждать стреляя в исключение или выполнять инструкции с finally

public static void main(String[] args) {
        try{
            throw new NumberFormatException("Error formato del numero");
        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
            System.out.println("Algo finalmente");
        }
    }
0
ответ дан 03.12.2019, 18:27

Теги

Похожие вопросы