Java 发生异常时重新请求用户输入

Java 发生异常时重新请求用户输入,java,exception-handling,Java,Exception Handling,我是java新手。我编写了一个程序,用户可以在其中选择要添加多少数字。如果用户输入一个字符串,它将抛出一个异常,程序会告诉用户再次输入所有详细信息 My code is as follow: import java.io.*; import java.util.*; class Add { public static void main(String args[]) throws Exception { boolean loop=true;

我是java新手。我编写了一个程序,用户可以在其中选择要添加多少数字。如果用户输入一个字符串,它将抛出一个异常,程序会告诉用户再次输入所有详细信息

My code is as follow:


import java.io.*;
import java.util.*;

class Add
{
    public static void main(String args[]) throws Exception
    {
        boolean loop=true;
        while(loop)
        try
        {
            String yn;
            do
            {
                Scanner s=new Scanner(System.in);
                System.out.println("Enter how many numbers to add: ");
                int num=Integer.parseInt(s.next());
                int a,sum=0;
                for(int i=1;i<=num;i++)
                {
                    System.out.println("Enter number["+i+"]: ");
                    a=Integer.parseInt(s.next());
                    sum=sum+a;
                }
                System.out.println("The Sum is:"+sum);
                System.out.println("Do you want to continue?(Y/N):");
                yn=s.next();

            } while(yn.equals("y")||yn.equals("Y"));
        }
        catch(Exception e)
        {
            System.out.println("Try Again\n");
        }
    }
}
我的问题是我希望程序要求用户重新输入他输入错误的号码的详细信息

例如:用户选择添加4个数字,但他输入第三个数字作为字符串,程序应要求用户从第三个数字重新输入,而不是再次输入全部细节

My code is as follow:


import java.io.*;
import java.util.*;

class Add
{
    public static void main(String args[]) throws Exception
    {
        boolean loop=true;
        while(loop)
        try
        {
            String yn;
            do
            {
                Scanner s=new Scanner(System.in);
                System.out.println("Enter how many numbers to add: ");
                int num=Integer.parseInt(s.next());
                int a,sum=0;
                for(int i=1;i<=num;i++)
                {
                    System.out.println("Enter number["+i+"]: ");
                    a=Integer.parseInt(s.next());
                    sum=sum+a;
                }
                System.out.println("The Sum is:"+sum);
                System.out.println("Do you want to continue?(Y/N):");
                yn=s.next();

            } while(yn.equals("y")||yn.equals("Y"));
        }
        catch(Exception e)
        {
            System.out.println("Try Again\n");
        }
    }
}
我的代码如下:
导入java.io.*;
导入java.util.*;
类添加
{
公共静态void main(字符串args[])引发异常
{
布尔循环=真;
while(循环)
尝试
{
字符串yn;
做
{
扫描仪s=新的扫描仪(System.in);
System.out.println(“输入要添加的数字:”);
int num=Integer.parseInt(s.next());
int a,和=0;

对于(int i=1;i您可以通过在代码中更深一层放置“重试”来解决此问题:

import java.io.*;
import java.util.*;

class Add {
    public static void main(String args[]) throws Exception {
        boolean loop=true;
        Scanner s=new Scanner(System.in);
        while(loop) {
            try {
                String yn;
                do {
                    loop = true;
                    System.out.println("Enter how many numbers to add: ");
                    int num=Integer.parseInt(s.next());
                    int a,sum=0;
                    for(int i=1;i<=num;) {
                        try {
                            System.out.println("Enter number["+i+"]: ");
                            a=Integer.parseInt(s.next());
                            sum=sum+a;
                            i++;
                        }
                        catch(Exception e) {
                            System.out.println("Invalid input. Try Again.\n");
                        }
                    }
                    System.out.println("The Sum is:"+sum);
                    System.out.println("Do you want to continue?(Y/N):");
                    yn=s.next();
                    loop = yn.equals("y")||yn.equals("Y");
                } while(loop);
            }
            catch(Exception e) {
                System.out.println("Number of elements invalid. Try Again.\n");
            }
        }
    }
}
import java.io.*;
导入java.util.*;
类添加{
公共静态void main(字符串args[])引发异常{
布尔循环=真;
扫描仪s=新的扫描仪(System.in);
while(循环){
试一试{
字符串yn;
做{
循环=真;
System.out.println(“输入要添加的数字:”);
int num=Integer.parseInt(s.next());
int a,和=0;
对于(inti=1;i,下面的代码应该有帮助

int i =1;
    while(i <=num){

        System.out.println("Enter number["+i+"]: ");
        try{
            a=Integer.parseInt(s.next());
            sum=sum+a;
            i++;
        }catch(NumberFormatException ex){
            System.out.println("Please enter a valid interger");
        }




    }
inti=1;

而(i使用额外的方法读取单个条目,直到其为有效数字:

private static int readNumber(Scanner s) {
    Integer value = null;

    while (value == null) {
        try {
            value = Integer.parseInt(s.next());
        } catch (NumberFormatException e) {
            System.out.println("bad format, try again...");
        }
    }

    return value;
}
System.out.println("Enter how many numbers to add: ");
int num = readNumber(s);
...

System.out.println("Enter number[" + i + "]: ");
a = readNumber(s);
....
然后,只要可以读取有效数字,就可以使用此方法:

private static int readNumber(Scanner s) {
    Integer value = null;

    while (value == null) {
        try {
            value = Integer.parseInt(s.next());
        } catch (NumberFormatException e) {
            System.out.println("bad format, try again...");
        }
    }

    return value;
}
System.out.println("Enter how many numbers to add: ");
int num = readNumber(s);
...

System.out.println("Enter number[" + i + "]: ");
a = readNumber(s);
....

方法getNumber保证仅当用户给出正确的整数时返回。

根据您的需要工作,但不符合道德规范

import java.io.*;
import java.util.*;

class Add
{
    public static void main(String args[]) throws Exception
    {
        boolean loop=true;int pos=0;int num=0,sum=0;
        while(loop)
        try
        {
            String yn;
            do
            {sum=0;num=0;
                Scanner s=new Scanner(System.in);
                System.out.println("Enter how many numbers to add: ");
                 num=Integer.parseInt(s.next());
                int a;
                for(int i=1;i<=num;i++)
                {
                    System.out.println("Enter number["+i+"]: ");
                    a=Integer.parseInt(s.next());
                    sum=sum+a;pos=i;
                }
                System.out.println("The Sum is:"+sum);
                System.out.println("Do you want to continue?(Y/N):");
                yn=s.next();

            } while(yn.equals("y")||yn.equals("Y"));
        }
        catch(Exception e)
        { 

            Scanner s=new Scanner(System.in);
            int a=0;
            for(int i=pos+1;i<=num;i++)
            { System.out.println("Enter number["+i+"]: ");
            a=Integer.parseInt(s.next());
            sum=sum+a;}
            System.out.println("The Sum is:"+sum);
        }
    }
}
import java.io.*;
导入java.util.*;
类添加
{
公共静态void main(字符串args[])引发异常
{
布尔循环=true;int pos=0;int num=0,sum=0;
while(循环)
尝试
{
字符串yn;
做
{sum=0;num=0;
扫描仪s=新的扫描仪(System.in);
System.out.println(“输入要添加的数字:”);
num=Integer.parseInt(s.next());
INTA;

对于(int i=1;i像您的
try
catch
应该嵌套在不同的地方。可能在
for
循环中,或者您可能需要另一个循环。在编写太多代码之前,最好尝试用铅笔和纸解决这些问题。只需将
try-catch
语句放在oop更深层次。使用
scanner.nextInt()
而不是
scanner.next()
-@Zhuinden,稍微好一点的样式,但没有解决异常处理问题同样,作为一般原则,编写
捕获(异常e)
通常是个坏主意。由于各种原因可能引发异常,通常,如果您正在处理异常,您会希望准确地知道要处理的异常类型。在这种情况下,最好编写
catch(NumberFormatException e)
或类似。即使整数解析失败,也会在求和时加上“a”,只请求n个数字,无效和有效的数字。它需要加上n个有效数字。确实如此,增量
i++
仅在
try
块的末尾执行。@Paul我相信你错了。这个解决方案在我看来是正确的。啊,不是吗i++@Paul:我同意有更好的方法来处理这个问题。使用更专用的框架;)如果用户键入一个由多个单词组成的句子来代替一个数字,那么看看会发生什么情况会很有趣。行
int num=readNumber(s)
甚至可以工作?我的意思是,你不能只给
null
作为
int
的参数,可以吗?方法本身应该返回
Integer
,而不是
int
。这是经过测试的吗?这不仅经过测试,而且可以工作。方法readNumber返回int,因为这个方法只在s.next()时返回是有效整数,因此值从不为null(而value==null可防止此情况发生)。下面的示例会话:
>输入要添加的数字数:>2>输入数字[1]:>111>输入数字[2]:>eee>错误格式,再试一次…>fff>错误格式,再试一次…>222>总和是:333
会话,包含多个单词而不是有效整数:
>输入要添加的数字数:>1>输入数字[1]:>1-2-3>错误格式,再试一次…>错误格式,再试一次…>错误格式,再试一次…>5>总和是:5