【问题标题】:Correctly setting up Java exception handling正确设置 Java 异常处理
【发布时间】:2014-01-23 06:04:10
【问题描述】:

一段时间以来,我一直在尝试编写 Java 异常处理程序,尝试了多种方法,甚至访问/阅读了 Oracle 的“Java 教程”,但我仍然无法理解。我不确定我做错了什么。对于我尝试使用的异常,我有一个给定的类 (TooLowException)。在我尝试使用它的方法中,我正在使用一个参数,如果它小于零,我需要捕获它。

    public int func(int num) throws TooLowException {
       int blah = num + 1;
       if ( blah < 0) {
           return blah;
       }
       else {
            String error = "Input is too low.";
            throw new TooLowException(error);
       }
     }

这是异常类:

    public class TooLowException extends Exception {
        public TooLowException(String response) {
            super(response);
        }
    }

我在 Oracle 中收到错误“未处理的异常类型 TooLowException”。我也尝试过 try-catch 方法,但它对我也不起作用。希望这是足以让某人指出我做错了什么的信息。我需要正确设置我的异常处理方式。

【问题讨论】:

  • try/catch 代码在哪里?
  • 你需要在调用func(int)的代码中处理这个异常;
  • 您需要在 else 部分添加 try catch 块,或者您必须在调用 func(num) 的代码部分添加 try/catch。
  • 你能发布你的 TooLowException 类吗?
  • @AmanArora 你的无聊门槛一定非常低。这个问题才出现了六分钟。

标签: java exception throw


【解决方案1】:

根据您提供的信息,您似乎需要在代码中的某处有一个 try/catch 块。基本上,在您的应用程序中某个地方正在调用 func(int) 方法,或者如果您遇到一个告诉您“未处理的异常类型 TooLowException”的编译器错误,则需要调用该方法。例外的一般规则是处理/捕获或声明。可以这样分解:

  • Handle/Catch:如果选择处理异常,则应从方法签名中删除“throws”声明(“public int func(int num) throws TooLowException”变为“public int func(int num)” )。这种方法背后的想法是,作为程序员,您打算处理这种类型的异常,因为它对方法来说足够具体,您不希望外部代码不得不担心处理方法范围之外的异常。这要求您使用 try/catch 块自己“处理”异常。
  • 声明:这是您采用的方法。您是说使用此函数的任何类都有使用 try/catch 块处理异常的负担。如果您编写的方法足够通用以至于许多不同的应用程序可以使用它并且处理异常应该是应用程序特定的,即由其他开发人员以自己的方式处理它,则将使用此方法。有些人喜欢只记录事情,有些人喜欢在收到某些异常时执行不同的控制流。

以下是有效的方法,如果它基本上回答了您需要做的练习,很抱歉,但它是为了帮助您!请花点时间了解这里发生了什么:

public class YourClassThisStuffIsIn {

    public static int func(int num) throws TooLowException {
           int blah = num + 1;
           if ( blah < 0) {
               return blah;
           }
           else {
                String error = "Input is too low.";
                throw new Exception(error);
           }
         }

    public static void main(String[] commandlineArgument){
        try {
            YourClassThisStuffIsIn.func(3);
        } catch (TooLowException tle){
            System.out.println("Caught " + e);
        }
    }  
}

当您在 IDE 中单击运行或通过控制台运行时,JVM 会查找具有正确签名的 main 方法。在这种情况下,它会找到它,并执行 main 方法。第一行是尝试,这意味着 JVM 必须为应用程序中可能出现的问题做好准备,允许它在抛出异常时恢复。在这种情况下,唯一可以抛出的异常是 TooLowException,您已经在 catch 块中编写了如何处理它的方法。您处理它的方式是简单地打印堆栈跟踪,我认为在这种情况下这很好。

我稍微更改了您的示例,使您的方法静态化,以便更快地编写。我还怀疑其意图是 commandLineArgument 是传递给 func(int) 方法的数字,因此在这种情况下,您正在查看 func 方法看起来像 func(Integer.parseInt(commandlineArgument[0] ))。

注意 parseInt 也会抛出 NumberFormatException,但您当然会记住 java.lang.RuntimeException 及其子类不是检查异常,因此不需要捕获它们,尽管这是一个好习惯!

【讨论】:

  • 将 try/catch 放在 main 中的调用周围是我没有做的事情……我真诚地希望我记得这一点。出于某种原因,每次我查找有关异常的信息时,我都没有抓住主要的“试图捕捉”方法的“抛出”;我一直认为那些是为了保持在方法内。您的项目符号解释也非常有帮助。谢谢!
  • 是的,有时很难想象整个流程链。基本上,任何抛出的检查异常都需要在某个地方捕获,无论是在抛出它的方法中(想想归零)还是一直到调用堆栈的开头。您的 func 方法可以包含 try/catch,也可以抛出异常让调用 func 的方法捕获它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2023-03-07
  • 2012-04-08
  • 2013-07-24
相关资源
最近更新 更多