Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何处理Java中的异常,而不必回到try代码块的开头?

如何处理Java中的异常,而不必回到try代码块的开头?
EN

Stack Overflow用户
提问于 2020-02-13 05:28:10
回答 2查看 106关注 0票数 0

我已经在我的程序中实现了异常处理,但现在我遇到的问题是,当异常发生并在catch块中处理时,它不是从它发生的地方继续,而是回到程序的开头,所以在catch块中所做的任何更改都是无用的。

简单的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Example {
   public static void main(String[] args) {
      int x;
      boolean repeat = true;
      Scanner input = new Scanner();
      do {
          try {
               x = input.nextInt();
               System.out.println("Success!");
               repeat = false;
          }
          catch(InputMismatchException e) {
              System.out.println(e.getMesasge());
              system.out.println("\nYou must enter an integer");

              //BTW am I correct in thinking the following clears the buffer?

              input.nextLine(); 
              x = input.nextInt();
          }
         } while (repeat);

但是如果我这样做了,程序将返回到do块的开头,因此它将重置X的值,而不是从成功消息所在的行继续。

我知道这是因为在那个时刻,重复布尔值为true,因此它会触发while条件重新开始,但是如果我在catch块中将其设置为false,我可能会暴露给自己一个未处理的异常,因为仍然有人可能尝试输入一些无效的东西。

一旦catch块处理了异常,有没有办法在抛出异常的行后返回控制?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-13 08:32:34

如果您的应用程序将有多个用户输入,那么您应该有多个循环来处理这些输入中的每一个,因为每个输入都有可能出错并生成异常。

在大多数情况下,如果异常是由于用户输入而发生的,那么保存该输入的变量中的值无论如何都是不需要的,因为它显然是错误的,或者至少已经落到了它的初始默认值。在这种情况下,通常您会希望用户有机会提供正确的输入。如果不是,那么不要一开始就把提示符放在循环中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Scanner input = new Scanner(System.in);
String ls = System.lineSeparator();

// We want the User to enter an inclusive number from 1 to 5.
int x = 0;
while (x < 1 || x > 5) {
    System.out.print("Enter an Integer Number from 1 to 5: --> ");
    try {
        x = input.nextInt();
        input.nextLine();   // Consume ENTER.
        System.out.println("Success! The nextInt() method accepted your input!");
        if (x < 1 || x > 5) {
            System.err.println("But...this application does not accept it!");
            System.err.println("We asked for a number from 1 to 5! Try again..." + ls);
        }
    }
    catch (InputMismatchException  ex) {
        System.out.println(ex.getMessage());
        System.err.println("Invalid Input! An Integer number from 1 to 5 only!" + ls);

        //BTW am I correct in thinking the following clears the buffer?
        /* YES you are since the nextInt() method does not consume the
           the newline character provided by the ENTER key like the nextLine()
           method does and therefore provides it on the next input request
           which in this case ultimately generates an endless loop of exceptions.
           Even if this prompt was successful and control is passed on to the 
           next prompt and if that prompt was a nextLine() method then it would 
           be basically skipped over because it would then consume that ENTER 
           key newline character provided in the last nextInt() method.  So
           with that in mind, it doesn't hurt to place input.nextline(); 
           directly after the x = input.nextInt(); ether.               */
        input.nextLine();   // Consume ENTER.
    }
}
System.out.println(x + " Was Supplied! - DONE!");

尽管有时它也有一定的用途,但我个人尽量避免使用异常。我认为如果可以的话,最好避免使用它们,这就是为什么对于控制台应用程序,我更喜欢使用接受所有键盘输入的Scanner#nextLine()方法,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Scanner input = new Scanner(System.in);
String ls = System.lineSeparator();

// Prompt 1:
// We want the User to enter an inclusive number from 1 to 5.
int x = 0;
String userIN = "";
while (x < 1 || x > 5) {
    System.out.print("Enter an Integer Number from 1 to 5 (q to quit): --> ");
    userIN = input.nextLine();
    if (userIN.toLowerCase().charAt(0) == 'q') {
        System.out.println("Quitting!");
        System.exit(0);
    }
    // Is it a signed or unsigned integer number with 1 or more digits?
    if (userIN.matches("-?\\d+")) {
        System.out.println("Success! The nextLine() method accepted your input" + ls
                + "to be a string representation of an Integer value!");
        x = Integer.parseInt(userIN);
    }
    else {
        System.err.println("Invalid Input! An Integer number from 1 to 5 only!" + ls);
        continue;
    }
    if (x < 1 || x > 5) {
        System.err.println("But...this application does not accept it!");
        System.err.println("We asked for a number from 1 to 5! Try again..." + ls);
    }

}
System.out.println(x + " Was Supplied! - DONE!" + ls);

// Prompt 2:
// We want the User to enter any float or double type numerical value.
double d = Double.MIN_VALUE;
while (d == Double.MIN_VALUE) {
    System.out.print("Enter a float or double type number (q to quit): --> ");
    userIN = input.nextLine().toLowerCase().trim();
    if (userIN.charAt(0) == 'q') {
        System.out.println("Quitting!");
        System.exit(0);
    } 
    // Get rid of the type designator from value if it exists.
    if (userIN.endsWith("f") || userIN.endsWith("d")) {
        userIN = userIN.substring(0, userIN.length() - 1);
    }
    // Is it a signed or unsigned integer, float, or double type number?
    if (userIN.matches("-?\\d+(\\.\\d+)?")) {
        System.out.println("Success! The nextLine() method accepted your input" + ls
                         + "to be a string representation of an Integer, float," + ls
                         + "or double type value!");
        d = Double.parseDouble(userIN);
    }
    else {
        System.err.println("Invalid Input! A Float or Double type numerical value is required!" + ls);
        d = Double.MIN_VALUE;
    }
}
System.out.println(d + " Was Supplied! - DONE!");
票数 0
EN

Stack Overflow用户

发布于 2020-02-13 05:34:44

如果在没有将repeat设置为true的情况下从catch块中删除input.nextLine(); x = input.nextInt();,则执行将继续到do的开始处,并要求用户输入值。如果输入了正确的值,则可以将repeat设置为false以中断do-while

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60200999

复制
相关文章
try catch 中的异常怎么处理?
在我们日常开发中, 经常会遇到一些异常需要去手动处理, 或者说是一些可能出现的异常去处理, 又或者说你不知道的异常, 等着暴露出来发现后去处理, 无论哪种异常, 当它出现的时候都是头疼的.
星尘的一个朋友
2020/11/25
1.2K0
java中哪块代码或说什么代码应该放在try块中呢?
我怎么知道哪块代码可能出现问题,从而放在try块儿中呢?马 克-to-win:一个笨办法,开始时,你并不加try,但你发现,运行时,用户赋给除数一个0,所以程序在这崩溃了,于是你就把这块代码加个try,过 两天,用户又犯了一个数组越界的错误,致使程序崩溃了。马克-to-win:你又加了个try,久而久之,你的try块儿就会变得越来越大,你的代码就会 变得越来越健壮。马克-to-win:再往后,你就有经验了,你自然知道常规的,只要用户可以赋给除数值时,就应该放在try块儿当中。
马克java社区
2021/04/06
4120
java中哪块代码或说什么代码应该放在try块中呢?
Java中的异常处理详解(try、catch、finally、throw、throws)
Java异常处理的五个关键字: try、catch、finally、throw、throws
共饮一杯无
2022/11/28
1.4K0
如何使用try-except语句处理Python中的异常
在python爬虫行业里面,异常处理能力已经成为了一项非常重要的技能。随着软件规模的不断扩大和复杂性的增加,异常处理能力已经成为了评判一个示波器水平的重要指标。 ,学会使用try-except语句来捕获和处理Python异常,对于我们做爬虫的来说是非常有必要的。
小白学大数据
2023/09/20
4180
深入理解异常处理:try、catch、finally 语句块的执行顺序
异常处理是现代软件开发中不可或缺的一部分。当程序运行时遇到意外情况或错误时,异常处理能够帮助我们优雅地处理这些问题,确保程序继续正常运行或进行适当的清理工作。本文将深入讨论异常处理中的核心组件:try、catch 和 finally 语句块的执行顺序。我们将通过代码示例和实际案例演示它们在不同情境下的行为,以便读者更好地理解和运用异常处理。
疯狂的KK
2023/09/26
3.3K0
深入理解异常处理:try、catch、finally 语句块的执行顺序
.NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
发布于 2018-11-02 21:14 更新于 2018-12-14 01:54
walterlv
2020/02/10
6930
python中的异常(try)
1.异常 程序在运行的时候,如果python解释器遇到一个错误,会停止程序的执行, 并且提示一些错误的信息,这就是异常 我们在程序开发的时候,很难将所有的特殊情况都处理, 通过异常捕获可以针对 突发事件做集中处理,从而保证程序的健壮性和稳定性
py3study
2020/01/09
1.1K0
Java异常处理try-catch-finally的执行过程
try-catch-finally程序块的执行流程以及执行结果比较复杂。基本执行过程如下:
用户7886150
2021/04/07
1K0
python try异常处理
错误和异常: 错误: nameerror 未声明、初始化对象 indexerror 序列中没有此索引 syntaxerror 语法错误 keyboardinterrupt 用户中端执行 EOFEror 没有内建输入,到达EOF标记 IOErrot 输入/输出操作失败 import time
py3study
2020/01/06
4990
python抛出异常和捕获异常_在try块中可以抛出异常吗
2.解析 关键字try 以及except是 使用Python 解释器主动抛出异常的关键, Python解释器从上向下执行 当运行try中的某行代码出错,会直接进入except中执行下方代码 try中错行下方的代码不会被运行 except…as… 是固定的语法格式 打印traceback信息 finally 后的代码不管是否抛出异常都会执行 except 的原理 调用sys中 exc.info 方法返回基本信息 所以抛出异常的第一步拓展可以在这里开始 注意 每个关键字下方的代码都是独立的(所有的变量都是局部变量)
全栈程序员站长
2022/11/02
4.5K0
Python编程思想(32):异常处理中的try…except
现在绝大多数编程语言都支持异常处理,异常处理的通行做法是将正常执行的代码放在特定代码块中,然后再将处理异常的代码放在另一个代码块中,如果正常执行的代码块的某条语句抛出了异常,那么就会直接跳到处理异常的代码块中继续执行。而在正常的代码块中抛出异常语句后面的所有代码都不会被执行。
蒙娜丽宁
2020/07/08
8080
Java 中的异常处理
在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。
崔笑颜
2020/06/08
1.3K0
Java异常处理只有Try-Catch吗?
今天,我们将讨论一个非常重要的主题-Java 中的异常处理。尽管有时可能会对此主题进行过多的讨论,但并非每篇文章都包含有用且相关的信息。
武培轩
2019/12/03
1.3K0
Java中的异常处理
Java的基本设计思想是“Badly formed code will not be run!”。这句话的大致意思是:错误形式的代码不会被运行。 我们在写代码的时候,提升错误恢复能力是提升代码健壮的重要措施。而“为了创建一个更加健壮的系统,那么每一个组件都必须是健壮的”。从而,在Java中出现了异常处理机制。 不像C语言,基本处理错误的代码都是程序员写上去的,而在Java中,除非是要自己自定义异常的时候,我们一般都是通过异常处理代码块来解决问题的。不但提高了代码的健壮性,还提高了代码的可读性。 那么,异常处理的定义是什么呢?当程序运行时出现了异常(不是错误),可能是空指针异常等等很多异常,能够对当前出现异常的代码进行处理,或是直接报告异常,或是将异常抛给特定的位置进行决断处理。 同大多数的需求一样,异常处理也被设计者设计成了一个类:Throwable。在这个类的下面,又有Error(错误)、和Exception(异常)。Error(错误)一般情况下不会通过代码进行处理,因为一般能报错误的情况,都是十分严重的情况,大多数错误都是由JVM(Java虚拟机)引起的。例如下面的代码:
roobtyan
2019/02/21
1.3K0
Java中的异常处理
Java 捕捉异常 finally代码块
finally相当于一个万能的保险,但有4种情况不会被执行 前面代码使用了System.exit(0) finallly代码块中有错误 cpu关闭(停电了之类) 程序所在线程死亡。比如控制台等待我输入数据, 我直接把它给关了, 手动结束线程
用户2965768
2019/03/08
8230
Java 捕捉异常 finally代码块
java中的异常处理
Java中的异常处理是Java程序设计的一个核心概念,异常处理能够提高程序的可靠性和稳定性。在Java中,异常是指在程序执行过程中出现的一些错误情况,比如数据格式错误、文件不存在、网络连接中断等。Java中提供了一套完善的异常处理机制,程序员可以通过捕获异常、处理异常、抛出异常等方式来处理这些异常情况。
堕落飞鸟
2023/03/31
1.1K0
java中的异常和异常处理
Java的基本理念是“结构不佳的代码不能运行”,在我们进行编写代码的时候一般通过编译的时候就可以看出代码是否有错误,但是在这一阶段并不能处理完成所有的异常,如一些不可预知的情况,在运行期间才会暴露。所以Java中对异常做出了如下归类。
袁新栋-jeff.yuan
2020/08/26
1.9K0
java中的异常和异常处理
Java中的异常处理1使用try,catch异常继承架构该抓还是该抛
这个程序可以让用户输入任意个整数,以0作为结束的标志,最后会显示输入整数的平均值。 下面我们进行简单的测试
desperate633
2018/08/22
9250
Java中的异常处理1使用try,catch异常继承架构该抓还是该抛
【Java异常】什么是异常,Java中如何处理异常?
注意:当三个块中都出现了return语句,首先记录try{}中return的结果,出现异常时,还会记录catch{}中return的结果,最后记录finallu{}块中的结果,最终返回的是finallu{}块中的结果
.29.
2023/10/23
2000
【Java异常】什么是异常,Java中如何处理异常?
【Kotlin 协程】Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )
异常代码示例 : 如果收集的元素 it <= 1 , 则检查通过 , 否则当 it > 1 时 会报异常 ;
韩曙亮
2023/03/30
1.9K0
【Kotlin 协程】Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

相似问题

返回到代码块的开头

21

返回到代码块的开头?

32

理解Java异常处理:简单的Try Catch块

40

"try...catch“块中的代码如何抛出未处理的异常?

64

在try catch块java中获取未处理的异常

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文