无法理解带有 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。
我的问题是:
- throws部分写对了吗?我假设这里应该有一些处理机制,但我没有信心。
- 为什么代码现在可以工作,而没有 '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",但是嘿,它有效。
您提供的代码中的某些方法可能会抛出已检查的异常。这些已检查的异常 必须 由代码处理。为此,您有两个选择:
- 要么用try/catch块处理可能的异常
- 或者从方法签名中提供throws关键字的方法抛出异常
如您所见,代码的作者决定从方法中抛出异常而不进行处理。异常将转到 main 方法,在程序终止之前将其打印到错误输出。
如果您指的是 main 方法中的 throws,那么这是一种无需使用 catch 块即可捕获任何可能的异常的方法。
基本上没有什么可以捕获它,因为 java 本身不调用 main,VM 会调用,如果 VM 捕获异常,它会将堆栈跟踪打印到 stderr System.err.print ()
和然后退出。
这在测试时非常有用,因为您不必担心捕获等问题,然后让 VM 自己做所有事情。
我试图理解别人写的一些代码,但不明白 '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。
我的问题是:
- throws部分写对了吗?我假设这里应该有一些处理机制,但我没有信心。
- 为什么代码现在可以工作,而没有 '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",但是嘿,它有效。
您提供的代码中的某些方法可能会抛出已检查的异常。这些已检查的异常 必须 由代码处理。为此,您有两个选择:
- 要么用try/catch块处理可能的异常
- 或者从方法签名中提供throws关键字的方法抛出异常
如您所见,代码的作者决定从方法中抛出异常而不进行处理。异常将转到 main 方法,在程序终止之前将其打印到错误输出。
如果您指的是 main 方法中的 throws,那么这是一种无需使用 catch 块即可捕获任何可能的异常的方法。
基本上没有什么可以捕获它,因为 java 本身不调用 main,VM 会调用,如果 VM 捕获异常,它会将堆栈跟踪打印到 stderr System.err.print ()
和然后退出。
这在测试时非常有用,因为您不必担心捕获等问题,然后让 VM 自己做所有事情。