Есть какой-то способ вынуждать разрыв, не вызывая исключения, от внутреннего помещения 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, не вынуждая исключения, если есть какая-то предвиденная форма.
Вї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
Для этого случая он рекомендовал бы тебе создавать собственные исключения увеличивая класса 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
корреспондент, выполняя действия, желаемые внутри этого блока.
Хорошие.
Ты можешь бросать исключение с любой части программы, не импортируя, если она захвачена одним catch
. Чтобы это делать ты должен создавать исключение и бросать ее с размещенным словом throw
следующего способа:
throw new EmptyStackException();
Это сделает, что блок catch
с подходящим типом исключения работайте. Для этого он ищется согласно батарейке призывов к блоку, который может захватывать это, если нет, виртуальная Машина закончит выполнение программы, когда ему не удается обработать ошибку (распространение исключений, What is exception propagation?).
Считай следующее изображение:
Ты можешь бросать с 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
есть два выбора: он превращается или бросает исключение.
Сейчас, если ты хочешь более короткий код, ты можешь менять блок:
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);
Функция 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!!!");
}
Конец одного try-catch
- Г©ste, если то, к чему стремятся, состоит в том, чтобы не стал совсем не прибывшим случай так как просто, оставлять это vacГ - или:
try{
}catch(SomeException e){}
, Хотя во мне opiniГіn он не рекомендуется, так как в таком случае имения неожиданного поведения, Г©stas исключения - те, которым они помогают нам отлаживать cГіdigo.
, Если то, что он хочет, состоит в том, чтобы отпускать catch
ГљNICAMENTE в случае в особенности, немного сходно с одним break xyz;
для одной iteraciГіn, это не является возможным.
Ты можешь бросать исключение с
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 ты называешь функцию, которая делала бы все утверждения, эта функция посылает исключение, когда что-то не внутри необходимого
Вї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) {
...
...
}
На основании которого ты пишешь, что ты хочешь сделать мне я 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Г-..., если тебе удается открыть, как делать это имеет ответ пожалуйста.
Хороший как они комментируют это тебе наверху, ты можешь делать один 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
// ...
//
}
ты можешь выполнять вынуждать стреляя в исключение или выполнять инструкции с 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");
}
}