为什么我们需要Java中的throw关键字?

时间:2019-01-12 07:00:29

标签: java exception-handling

this answer中,提供的代码为:

void greet(String name) {
    if (name == null) {
        throw new IllegalArgumentException("Cannot greet null");
    }
    System.out.println("Hello, " + name);
}

我在所有学习“ throw”关键字的网站上都看到了类似的示例。每当我看到这样的示例时,对我来说都没有意义的是为什么一个人为什么不打印:“不能问候空”而不是抛出异常

问题:

  1. 是否有更好的throw关键字实用程序示例? (我即将高中毕业,并且只知道高中水平的Java编程,因此请避免使用复杂的示例)

  2. 在给定的示例中,用户为什么选择抛出异常而不是简单地打印错误?

6 个答案:

答案 0 :(得分:3)

现在是时候修改Java中异常处理的概念了。

首先是什么例外,每当在执行代码行时发生一些错误或说问题时,就将其称为例外。

例如, 如果某人将某物除以0,则它将给出异常,因为计算机无法处理未定义的实体。

另一个例子是当您声明扫描程序以获取整数输入时,但用户输入了字母,因此也会导致异常。

这里我们进行异常处理,这意味着我们将以不会导致程序关闭的方式处理异常,在try和catch语句中包含的那些特定行将无法正常工作,但其他行将被执行。

现在,如果我们已经创建了一种方法来进行假设操作以打印一行,并且在打印该行时发生了异常,那么我们可以在发生异常的地方做两件事来处理该异常或将其抛出。 / p>

如果我们在那个地方处理异常就可以了,如果我们抛出异常,那么就必须在调用该方法的地方捕获它。

现在,因为有两种类型的异常 1)运行时异常,我们称为未检查异常 2)编译时异常,我们称为检查异常

两个异常也可以在类级别和方法级别进行处理,我们还可以做一件事,即链式处理。这意味着一个类将向其他类抛出异常,等等。

答案 1 :(得分:1)

我认为以下答案可以帮助您了解....

  1. 是否有更好的throw关键字实用程序示例?

基本上,ThrowThrows用于防止应用程序因抛出异常而出错或崩溃。 在方法签名中使用Throws,并使用Throw防止流程出错。 因此,这是一个简单的示例。

    public class Test {

    // here we have used "throws" in method signature 
    //   because we are throwing new Exception(), if array is null
    public static int getValue(int[] array, int index) throws Exception {

        // here we are preventing application from getting 
        // unconditional error (NullPointer exception)
        // if array is null, then we are throwing new Exception()
        if(array == null) {
            throw new Exception();
        }

        int value = array[index]; 
        return value;
    }

    public static void main(String[] args) {
        int[] array = null;
        // here we are wrapping our getValue() function call to try catch block
        // because getValue() function can throws Exception
        // so we are making it safe to execute our program
        try {
            int value = getValue(array, 0);
            System.out.println("value " + value);
        } catch (Exception e) {
            System.out.println("Provided array is null... so we caught the exception...");
        }
    }
}

如果您想进一步了解throw和throws的工作原理...那么您还需要了解异常处理(已检查和未检查)

  1. 在给定的示例中,为什么用户选择抛出异常而不是简单地打印错误?

按照给定的示例,您的函数目的是打招呼,但如果其他函数使用以下命令调用greet() null值,则没有任何理由像Hello, null那样打招呼,因此他在执行该语句之前引发了异常。喜欢...

    void greet(String name) {
        System.out.println("Hello, " + name);
    }

    String myName = null;
    greet(myName); // it will print "Hello, null";

答案 2 :(得分:0)

“ Throw”关键字用于通知调用者所传递的参数无效(在这种情况下),或者通常来说,在执行调用者调用的代码时出了点问题。

考虑一个编写在线购物应用程序的示例。以下是事件的简单顺序:

  • 用户滚动浏览项目并选择一个或多个项目
  • 物品已添加到购物车中,用户点击结帐
  • 用户被重定向到第三者的付款页面,在该页面中,他输入卡的详细信息并进行付款
  • 显示成功页面给用户

现在,在付款过程中,如果卡号不正确或用户的卡中余额不足,您会把错误发回给呼叫者(即购物应用程序)还是直接登录到控制台(在付款时)提供方)并返回响应?当然是前者,所以这只是让呼叫者知道有错误,他应该妥善处理(在本例中,在结帐时显示适当的消息)。

答案 3 :(得分:0)

throw语句会突然终止当前函数的执行,并将控制权直接返回给调用者,迫使他们处理错误,或将异常重新抛出链。

除了错误消息之外,异常对象还包含有关错误发生的位置和原因的大量信息。它可以跟踪错误在调用堆栈中的何处发生,并允许您查找导致错误的调用顺序。

一条打印语句根本不能做所有这些事情。您的例子已经很好。问候功能的工作是打印问候语。如果您传入null,则该函数无法这样做。在此处打印消息可能会造成混淆。相反,它迫使您处理输入无效的事实,而不是打印出可能有人误以为问候的良性信息。

答案 4 :(得分:0)

尝试Java 8 Optional

String nullVal = null;
System.out.println(Optional.ofNullable(nullVal).orElseGet(() -> null));

String notNull = "Hello Optional";
System.out.println(Optional.ofNullable(notNull).orElseGet(() -> null));

可以这样修改方法:

public static void greet(String name) {
    System.out.println("Hello, " + Optional.ofNullable(name).orElseGet(()->null));
}

答案 5 :(得分:0)

Assume a function checks that in the passed directory is no malicious file. That could be a void method where you need to catch the exception for the rare case, bypassing the normal processing after the call.

try {
    checkDirectorySafe("/home/Donald");
    ... 
} catch (VirusException e) {
    ...
}

The catch might be late in the code and also catch exceptions in other parts.

There is an other advantage. The function can check all files in the directory and for all subdirectories need only recursively call itself with the subdirectory path. On an exception the call stack is unwound upto the catch.

The Alternative would be to have a boolean or Optional result, and add if code. If the function also needs to return some data, that could become slightly uglier.

An exception is like a toilet in a mall.