Java尝试捕获

Java尝试捕获,java,try-catch,Java,Try Catch,我有一个java程序,应该处理一个异常,但最终结果与我的预期相差甚远。下面是我的程序的总体思路:它应该接受零的输入并退出程序。输入对话框应引起异常,应捕获该异常并打印消息bad number 我的大脑告诉我catch块中缺少一行代码 这是我的密码: import javax.swing.JOptionPane; public class exceptTest { public static void main(String[] args){ try {

我有一个java程序,应该处理一个异常,但最终结果与我的预期相差甚远。下面是我的程序的总体思路:它应该接受零的输入并退出程序。输入对话框应引起异常,应捕获该异常并打印消息bad number

我的大脑告诉我catch块中缺少一行代码

这是我的密码:

import javax.swing.JOptionPane;


public class exceptTest {

    public static void main(String[] args){
        try {
            String line = JOptionPane.showInputDialog(null, "enter number");
        if(line.equals ("0"));
        System.exit(0);
        }catch(Exception e){

            JOptionPane.showMessageDialog(null, "bad number");
        }
    }
}

这里没有捕捉到异常,您只是在做一个if语句,您可以使用if/else

try{ 
     String line = JOptionPane.showInputDialog(null, "enter number");
     if(line.equals ("0")){
          System.exit(0);
     }else{
        JOptionPane.showMessageDialog(null, "bad number");
     }
}catch (Exception ex){
     ex.printStackTrace();
}

您将只用于任何异常的捕获showInputDialog抛出,但对于您的数字检查,您没有捕获任何内容,它只是不是0

if语句后面有一个分号,它终止该行,编译器不查找if语句的其余部分。去掉分号,它就可以正常工作了

import javax.swing.JOptionPane;

public class exceptTest 
{

    public static void main(String[] args){
        try 
        {
            String line = JOptionPane.showInputDialog(null, "enter number");
            if(line.equals ("0")) //semi-colon removed here
            {
               System.exit(0);
            }
            throw new IllegalArgumentException("Input was not 0");
        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, "bad number");
        }
    }
}

如果输入不等于0,则代码不会引发异常。因此,您永远不会捕获任何内容,因此屏幕上不会显示错误消息

你可以做两件事: -如果输入不是0,则抛出异常,然后输入catch 或 -如果显示错误消息,则不需要使用try catch来检查输入是否为0


编辑:当然,正如Hunter McMillen所注意到的,您需要删除if语句后的分号。

您不会执行异常处理代码,因为您从未抛出异常。代码将执行输入,然后测试输入是否等于0,然后根据该值显示或不显示对话框,然后执行

引发异常的原因可能是代码将处理的条件之外发生了某些事情,也可能是您显式地引发了一个异常

所谓外部条件等等,我指的是类似于除以0的东西。Java或任何其他语言都不会处理这个问题,并且会引发异常。过程处理的正常步骤将停止,并将调用执行处理程序

在您的情况下,例如,如果您试图将输入解析为一个数字,但该输入不是一个数字,您将得到一个异常。这与您所说的功能不同,但更好地说明了异常的用途。差不多

try
{
int numberEntered = Integer.parse(line);
JOptionPane.showMessageDialog(null, "Entered a number, parsed to " + numberEntered);
}
catch (NumberFormatException nfe)
{
JOptionPane.showMessageDialog(null, "Did not enter a number, but <" + line + ">");
}
显示了异常通常适用于的类型

如果您愿意,可以定义一个异常,将其称为BadNumberException,并将其放入您的代码中—我想您可以将其放入If语句的else子句中。但是你的例程会抛出异常,我认为抛出异常的例程也捕获异常是不寻常的

希望有帮助。
rc

你好,斯莫尔曼,我可以这样做,而且也容易多了。但是我的程序的想法是利用try-and-catch异常,这使得它更具挑战性。谢谢你的回复!if语句后仍然有一个分号会导致问题。如果您的目标是捕获异常,那么您需要在它不是0时手动抛出一个,但由于它当前的状态,无论您键入什么数字,它都不会抛出并捕获任何内容。您完全正确地排除了分号,但是单凭这一点并不能解决问题,请参见@BVSmallman的答案。这种“有效”,但我认为它不符合OP的目标。@Mac我现在看到了上面的内容,但即使使用else块,你也永远无法达到它,因为使用了半结肠标记以显示不同的解决方案。哦,我知道我做错了什么,需要补充什么。谢谢我的程序员们!