无法理解带有 throws 的外部代码

Trouble understanding external code with throws

我试图理解别人写的一些代码,但不明白 'throws' 是如何使用的。这是代码:

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class WhoisQuery {

    public static void main(String[] args) throws Exception {
        String domainNameToCheck = "abcnews.com";
        performWhoisQuery("whois.enom.com", 43, domainNameToCheck);
        performWhoisQuery("whois.internic.net", 43, domainNameToCheck);
    }

    public static void performWhoisQuery(String host, int port, String query) throws Exception {
        System.out.println("**** Performing whois query for '" + query + "' at " + host + ":" + port);

        Socket socket = new Socket(host, port);

        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
        BufferedReader in = new BufferedReader(isr);

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.println(query);

        String line = "";
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
    }

据我了解,应该以某种方式处理带有 throws 的代码。但是,没有像 try catch 这样的处理机制。那么这里 throws 的确切目的是什么?我测试了它,没有抛出 returned IOexception。

我的问题是:

  1. throws部分写对了吗?我假设这里应该有一些处理机制,但我没有信心。
  2. 为什么代码现在可以工作,而没有 'throws' 在此状态下就不能工作?如果没有 catch/try 语句,它不应该 return 错误吗?我没有看到没有 'throws' 和没有 catch/try 的抛出之间的区别。

从 main 抛出的任何东西都会写入 stderr。如果您有一个小程序,并且只想退出处理并在出现错误时在控制台上查看堆栈跟踪,这是处理异常的最简单方法。

IOException 是一个已检查的异常,因此如果您想避免在该方法中捕获它,则必须抛出它。 IOException 是 Exception 的子类,所以 throws Exception 包含 IOException.

如您所述,"code with throws should be handled in some way"。但是,try-catch 子句并不是处理 throws 声明的唯一方法。另一种选择是决定您不处理该异常,并简单地向调用方法添加一个 throws 子句。您可以继续添加这些 throws 声明,直到到达 main,在这种情况下,您实际上是在声明您的程序不处理错误,并且在发生此类错误时会毫不客气地崩溃。

它不优雅或 "proper",但是嘿,它有效。

您提供的代码中的某些方法可能会抛出已检查的异常。这些已检查的异常 必须 由代码处理。为此,您有两个选择:

  1. 要么用try/catch块处理可能的异常
  2. 或者从方法签名中提供throws关键字的方法抛出异常

如您所见,代码的作者决定从方法中抛出异常而不进行处理。异常将转到 main 方法,在程序终止之前将其打印到错误输出。

如果您指的是 main 方法中的 throws,那么这是一种无需使用 catch 块即可捕获任何可能的异常的方法。

基本上没有什么可以捕获它,因为 java 本身不调用 main,VM 会调用,如果 VM 捕获异常,它会将堆栈跟踪打印到 stderr System.err.print () 和然后退出。

这在测试时非常有用,因为您不必担心捕获等问题,然后让 VM 自己做所有事情。