我有一些丑陋的代码,想要重构它:
public class UdpTransport extends AbstractLayer<byte[]> {
private final DatagramSocket socket;
private final InetAddress address;
private final int port;
/* boolean dead is provided by superclass */
public UdpTransport(String host, int port) {
this.port = port;
InetAddress tmp_address = null;
try {
tmp_address = InetAddress.getByName(host);
} catch (UnknownHostException e) {
e.printStackTrace();
dead = true;
socket = null;
address = null;
return;
}
address = tmp_address;
DatagramSocket tmp_socket = null;
try {
tmp_socket = new DatagramSocket();
} catch (SocketException e) { …Run Code Online (Sandbox Code Playgroud) 我研究过:然而,对于未经检查的异常,编译器不会强制客户端程序员捕获异常或在throws子句中声明它.事实上,客户端程序员可能甚至不知道可能抛出异常.例如,StringIndexOutOfBoundsException由String的charAt()方法抛出.
这是什么意思?
根据该代码,不需要在代码中放置try catch块,但我已经看到编译器强制将代码放入try catch块中.
我很困惑他们到底是什么?
我已经阅读了关于此的所有内容,但我仍然不明白如何使用已检查和未检查的异常.我想我还是不能理解这个概念.我已经阅读了StackOverflow,最好使用未经检查而不是检查异常,但Eclipse 强制我使用已检查的异常,如FileNotFoundException(AFAIK,如果Eclipse强制我插入try/catch块,它是一个已检查的异常).我想知道,有没有办法将检查转换为未检查?到底该处理什么?我不明白处理异常是什么.
我在这里有这个例子,我真的想知道如何处理(?)这个.这是一个经过检查的例外,对吧?
public void readFile() {
File foo = new File("./foo.bar");
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(foo));
} catch (FileNotFoundException e) {
// What should I do here?
}
getDataFromFile(bufferedReader);
}
Run Code Online (Sandbox Code Playgroud)
我见过人们在这里做的各种事情.有些人会打印堆栈跟踪,这就是我通常所做的,而且我没有看到它的问题.它为我提供了调试所需的信息.有些人会忽略它们,我认为不应该这样做(我看到JNode OS引导程序忽略了异常).有些人只是throws在签名中添加声明.有些人会在这件事中抛出更多例外!(我想也许这是使用unchecked而不是checked方法?)
此外,如果你添加throws声明,你将被迫进一步放置一个try/catch块,如果你有一个非常大的应用程序,这是不方便的.对不起,我只是一无所知.完全.我正在努力学习优雅而优雅的设计,这让我感到折磨.
java exception-handling exception checked-exceptions unchecked-exception
我正在玩弄将一组对象写入文件的方法.为什么使用Iterable.forEach()的下面的实现不能编译?在Eclipse中,我收到的消息是没有处理IOException.这特别令人困惑,因为我似乎正在处理IOExceptions.
public void write(Iterable<?> objects) {
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("out.txt"), "UTF-8"));) {
objects.forEach((o) -> bw.write(o.toString())); //Unhandled exception type IOException
} catch (IOException e) {
//handle exception
}
}
Run Code Online (Sandbox Code Playgroud)
显然,下面的工作.我很感兴趣为什么以上不起作用以及如何解决它.
for (Object o : objects) { bw.write(o.toString()); }
Run Code Online (Sandbox Code Playgroud)
有人告诉我,在Java中,未经检查的异常可以在try块中捕获,但如果它被捕获,是不是称为已检查异常?
我知道Java强制程序员列出该方法将抛出的所有异常,从而创建一种简单的方法来列出代码用户可能抛出的所有异常.
另一方面,.NET没有这样的功能,我们剩下的就是API文档或XML文档,其中有时会列出异常.
是否有VS的插件显示任何给定调用可能抛出的异常?鉴于反射的强大功能,不应该通过调用查看,并查看可能的所有分支通过调用并检查是否抛出任何.NET异常?
.net static-analysis exception-handling visual-studio checked-exceptions
我有一个带有父类的已检查异常的方法,它可以抛出父类和子类的异常
public void method() throws ParentException {
if( false ) throw new ParentException();
else if( true ) throw new ChildException(); // this one is thrown
}
Run Code Online (Sandbox Code Playgroud)
我有一个级联catch块,它首先有子例外
try {
method();
} catch (ChildException e) {
// I get here?
} catch (ParentException e) {
// or here?
}
Run Code Online (Sandbox Code Playgroud)
哪个块会捕获抛出的异常?由于该方法仅显式声明了ParentException,因此ChildException是否会显示为ParentException的实例?
在.NET中,方法签名不会告诉我是否错过了处理我的代码可能抛出的一些异常.是否有一些工具可以警告我,如果说我正在使用HashTable删除但是没有处理ArgumentNullException?我不想在运行时感到惊讶.
这是否意味着您需要非常了解您的代码,否则未经检查的异常可能更难以使用?
我正在编写将用于访问数据库的Java库.我向最终程序员抛出异常,他们使用JAR库以他/她想要的方式处理它.
我编写了一个自定义异常(下面提供)来将特定于连接的异常包装在一起,这样最终程序员就不必在代码中捕获所有这些异常.(为了方便他)
在编写Java库时,这是一个很好的做法吗?通过使用它,用户只需要在他的代码中捕获NConnectionException.
public class NConnectionException extends Exception {
private static final Logger logger = LoggerFactory.getLogger(NConnectionException.class);
public NConnectionException(Exception e) {
if (e instanceof NullPointerException) {
logger.error("ERROR IN READING DF");
e.printStackTrace();
}
else if (e instanceof FileNotFoundException) {
logger.error("FILE NOT FOUND");
e.printStackTrace();
} else if (e instanceof ParserConfigurationException)
{
logger.error("PARSE CONF ERR");
e.printStackTrace();
}
else if (e instanceof org.xml.sax.SAXException)
{
logger.error("SAX ERR");
e.printStackTrace();
}
else if (e instanceof IOException)
{
logger.error("IO ERR");
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
}
我被告知我应该考虑在我的代码中对Checked异常抛出Unchecked异常,而不仅仅是这样,而是用我自己的扩展RuntimeException.现在,我确实理解了两者之间的区别,但仍然不明白我为什么要这样做?
如果我有这个方法标题,抛出2种异常:
public static Optional<String> getFileMd5(String filePath) throws NoSuchAlgorithmException, IOException {}
Run Code Online (Sandbox Code Playgroud)
为什么我要用一个(不太详细的)例外替换它们?
java exception-handling checked-exceptions unchecked-exception