当前位置: 首页 > 知识库问答 >
问题:

如何恢复代码,即使在java中尝试和捕获异常处理后

郜昊苍
2023-03-14

我实际上对我的程序有困难。事实上,我在学校(11年级-大专)学习,所以请用非常简单的语言解释我。我正在开发一个测验,非常基本的学校项目,所以程序是这样进行的......我想让用户输入他/她的选择,通过输入1-4的数字。我不希望用户输入字母表、字母或特殊字符或除1-4以外的任何其他数字。我尝试使用try and cat,但我的程序在抛出异常后停止。我希望程序代码即使在显示错误消息System.out.println(“无效输入”)后也能运行。请输入1-4之间的数字);示例程序

import java.io.*;
  import java.lang;
  public class
  { 
   public static void main()throws IOException
   { 
     InputStreamReader read =new InputStreamReader (System.in);
     BufferedReader in =new BufferedReader (read);
     System.out.println(" Select your category");
     System.out.println(" 1. Food");
     System.out.println(" 2. National");
     System.out.println("");
     System.out.println(" Enter your choice"); 
     int choice=Integer.parseInt(in.readLine());
     if(choice==1)//food category
     { 
       int score = 0;
       System.out.println("what are dynamites made?");
       System.out.println("1. peanuts");System.out.println("2. grapes");
       System.out.println("3. flaxseeds");System.out.println("4. fish");
       System.out.println(" Enter your choice");
       int food1= Integer.parseInt(in.readline()); 
      if(c1=1)
      { System.out.println(" Correct answer");
        score=score+10
      }
       else
      { 
      System.out.println(" Wronge answer");
        score=score+0
      }
      //then i have the second question with the same format
     } 
      if(choice==2)//natioanl category with the same format as above
      {//two question with if else statements in them }
     }
}// also help me where to add the try and catch statements

共有3个答案

轩辕煌
2023-03-14

这个问题有一个更优雅的解决方案。不涉及尝试捕捉。

import java.io.*;
  import java.lang;
  public class
  { 
     //Compares response to the string representations of all numbers between 1 and numOptions, inclusive. 
     //Returns the matching integer or -1 otherwise.
     public static int parseResponse(String response, int numOptions) 
     {
          for(int i=1;i<=numOptions;i++) {
              if(response.equals(Integer.toString(i))) return i;
          }
          return -1;
     }

     public static void main()throws IOException
     { 
         InputStreamReader read =new InputStreamReader (System.in);
         BufferedReader in =new BufferedReader (read);
         System.out.println(" Select your category");
         System.out.println(" 1. Food");
         System.out.println(" 2. National");
         System.out.println("");
         System.out.println(" Enter your choice");

         //New code
         int choice=-1;
         while(choice==-1) {
             choice=parseResponse(in.readLine(),2);
             if(choice==-1)
             {
                 System.out.println(" Invalid input. Please enter a number between 1-2");
             }
         }


         if(choice==1)//food category
         { 
             int score = 0;
             System.out.println("what are dynamites made?");
             System.out.println("1. peanuts");System.out.println("2. grapes");
             System.out.println("3. flaxseeds");System.out.println("4. fish");
             System.out.println(" Enter your choice");

             //New code
             int food1=-1;
             while(food1==-1) {
                 food1=parseResponse(in.readLine(),4);
                 if(food1==-1)
                 {
                     System.out.println(" Invalid input. Please enter a number between 1-4");
                 }
             }

             if(food1==1)
             { System.out.println(" Correct answer");
               score=score+10
             }
             else
             { 
               System.out.println(" Wronge answer");
               score=score+0
             }
             //then i have the second question with the same format
        } 
        if(choice==2)//natioanl category with the same format as above
        {//two question with if else statements in them 
        }
    }
}// also help me where to add the try and catch statements

如果你不知道:

 if(response.equals(Integer.toString(i))) return i;

是和一样的

 if(response.equals(Integer.toString(i)))
 {
      return i;
 }
卢恩
2023-03-14

嘿,这是你可以运行的代码。

import java.io.*;

import java.lang.*;

public class TestTryCatch
{ 

public static void main(String args[])
{
    try
    {
        InputStreamReader read =new InputStreamReader (System.in);
        BufferedReader in =new BufferedReader (read);
        System.out.println(" Select your category");
        System.out.println(" 1. Food");
        System.out.println(" 2. National");
        System.out.println("");
        System.out.println(" Enter your choice"); 
        int choice=0;
        try
        {
            choice =  Integer.parseInt(in.readLine());
        }
        catch(Exception e)
        {
            choice=0;
        }
        if(choice==0)
        {
            System.out.println("Invalid Input");         
        }
        if(choice==1)//food category
        { 
            int score = 0;
            System.out.println("what are dynamites made?");
            System.out.println("1. peanuts");System.out.println("2. grapes");
            System.out.println("3. flaxseeds");System.out.println("4. fish");
            System.out.println(" Enter your choice");
            int food1= Integer.parseInt(in.readLine()); 
            if(food1==1)
            { System.out.println(" Correct answer");
            score=score+10;
            }
            else
            { 
                System.out.println(" Wronge answer");
                score=score+0;
            }

        } 
        if(choice==2)
        {
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();   
    }
}
}

在你转换成整数的地方放一个尝试捕捉。如果你的代码给出了异常,它会进入异常块,处理你想要的任何值。这里我把它放成了0,你也可以选-1。

如果这段代码有帮助或没有帮助,请恢复。

孔磊
2023-03-14

程序崩溃的地方是:

int food1= Integer.parseInt(in.readline()); 
if(c1=1)
{ System.out.println(" Correct answer");
  score=score+10
}

“c1”不是一个已定义的变量,因此无论用户输入什么,使用它都会导致程序崩溃。你应该用“food1”代替“c1”。此外,赋值运算符“=”应替换为比较运算符“=”。

查看整数的javadoc(谷歌“Integer javadoc”),你会发现

public static int parseInt(String s)
                throws NumberFormatException

因此,我们需要抓住数字形式感知。运行程序时,通过查看堆栈跟踪,还可以找出抛出了什么异常以及在哪里。

每当抛出异常时,都会跳过错误之后和下一个“}”之前的所有内容。由于大多数代码在错误发生后都会正常执行,我们希望尽量减少尝试捕获,即。

try {
    int choice=Integer.parseInt(in.readLine());
} catch (NumberFormatException ex) {
    //Not a number
}

我们需要变量“choice”在try之外可以访问,所以我们将在try之外声明它。

int choice;

try {
    choice=Integer.parseInt(in.readLine());
} catch (NumberFormatException ex) {
    //Not a number
}

但是,NumberFormatException不会告诉您用户是否输入了1-4以外的数字。因此,您必须添加自己的验证。

int choice;

try {
    choice=Integer.parseInt(in.readLine());
    if(choice<1 || choice>4) ; //Not 1-4
} catch (NumberFormatException ex) {
    //Not a number
}

最后,我们需要跟踪我们的输入是否有效,并在需要时循环。

boolean valid=false;

while(!valid) {

    int choice;

    try {
        choice=Integer.parseInt(in.readLine());
        if(choice<1 || choice>4) valid=false; //Not 1-4
        else valid=true;
    } catch (NumberFormatException ex) {
        //Not a number
        valid=false;
    }

    if(valid) {
         //Handle valid response here
    } else {
         System.out.println(" Invalid input. Please enter a number between 1-4");
    }
}

祝你好运!

 类似资料:
  • 问题内容: 最近,我遇到了一位程序员的代码,其中他在catch中有一条try-catch语句! 请原谅我无法粘贴实际代码,但是他所做的与以下内容类似: 我个人认为这是我见过的最差的代码!以1到10的比例,您认为我应该多久才能动一下脑子,还是我反应过度? 编辑:他实际上在抓捕中所做的事情,他正在执行一些操作,这些操作在初始尝试失败时可以/应该执行。我的问题是拥有干净的代码和可维护性。将异常从第一个c

  • 有可能在SWIFT中捕捉异常吗?给定以下代码: 有可能防止异常使整个程序崩溃吗?也就是说,在Objective-C中,与以下内容相对应的Swift等价是什么:

  • 本节介绍如何使用三个异常处理程序组件(try、catch 和 finally)来编写异常处理程序。 然后,介绍了 Java SE 7中引入的 try-with-resources 语句。 try-with-resources 语句特别适合于使用Closeable的资源(例如流)的情况。 本节的最后一部分将通过一个示例来分析在各种情况下发生的情况。 以下示例定义并实现了一个名为ListOfNumbe

  • 我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否

  • 问题内容: 我有此代码- 编译器将如何实际实现这一点。实际在汇编代码中生成的异常检查在哪里? 更新 我知道上面的代码如何转换为 bytecode 。字节码仅将try-catch转换为相应的try- handler块。我对它将如何转换为jvm进行汇编和/或处理感兴趣。 问题答案: 试捕法的成本 大致来说,block不会向结果程序集中添加任何异常检查代码。只要不引发异常,它基本上是无操作的。所有缓慢的

  • 问题内容: 好,我有问题。如果在处理HTTP请求时发生未捕获的异常,则我没有机会在http.ServerResponse对象上调用end()方法。因此,服务器将永远挂起并且永远不会满足该请求。 这是一个例子: 如果访问/ error,则会发生异常,但会被捕获。用户收到错误消息-没问题。但是,如果我访问/ hang,服务器最终将抛出未捕获的异常并永远挂起。以后对/ hang的任何请求都将挂起。 糟透