Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确设置Java异常处理_Java_Exception_Throw - Fatal编程技术网

正确设置Java异常处理

正确设置Java异常处理,java,exception,throw,Java,Exception,Throw,我已经尝试编写Java异常处理程序有一段时间了,尝试了多种方法,甚至访问/阅读了Oracle的“Java教程”,但我仍然无法直接理解。我不确定我做错了什么。对于我尝试使用的异常,我有一个给定的类(TooLowException)。在我试图在中使用它的方法中,我使用了一个参数,如果它小于零,我需要捕捉它 public int func(int num) throws TooLowException { int blah = num + 1; if ( blah

我已经尝试编写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);
       }
     }

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

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

  • 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);
        }
    }  
}
public类你的类这个东西在{
公共静态int func(int num)抛出TooLowException{
int blah=num+1;
如果(blah<0){
返回废话;
}
否则{
字符串错误=“输入太低。”;
抛出新异常(错误);
}
}
公共静态void main(字符串[]commandlineArgument){
试一试{
你的类这个东西在函数(3)中;
}捕捉(工具例外tle){
系统输出打印项次(“捕获”+e);
}
}  
}
当您在IDE中单击run或在控制台中运行时,JVM将查找具有正确签名的main方法。在本例中,它找到它,并执行main方法。第一行是一次尝试,这意味着JVM必须为应用程序中可能出现的问题做好准备,允许它在抛出异常时进行恢复。在这种情况下,可以抛出的唯一异常是TooLowException,您已经编写了如何在catch块中处理它。您处理它的方法就是简单地打印堆栈跟踪,我认为在这种情况下这很好

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


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

其中是
try/catch
代码。您需要在调用
func(int)
的代码中处理此异常;要么你需要在else部分添加try-catch块,要么你必须在调用func(num)的代码部分添加try/catch。你能发布你的TooLowException类吗?@AmanArora你的无聊阈值必须非常低。这个问题只出现了六分钟。主要是我没能做到尝试/抓住电话……我真诚地希望我能记住这一点。出于某种原因,每次我查找有关异常的信息时,我都无法理解main的“试图捕捉”方法的“抛出”;我一直认为这些都是为了保持在方法之内。你的子弹解释也很有帮助。谢谢是的,有时很难想象整个流程链。基本上,任何抛出的已检查异常都需要在某个地方被捕获,无论是在抛出异常的方法中(想想Ground Zero),还是一直到调用堆栈的开头。func方法中可以包含try/catch,也可以抛出异常以使调用func-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);
        }
    }  
}